2016-12-16 12 views
1

私はエクスプレスでより新しい、エクスプレスアプリを展開しています。私はすべてのAPIが呼び出される前に関数checkApiKeyを呼びたいと思います。ここに私のAPIのルートエクスプレスルートネストされたコールバック

var express = require('express'); 
var router = express.Router(); 
var fn = require('../webservices'); 
router.post('/api/signup',fn.checkApiKey, fn.signup); 
module.exports = router; 

、ここで私のwebservice.js

var fs = require('fs'), 
    path = require('path'); 
var db = require('./conn') 
var models = require('./models') 

function signup(req, res, next){ 
    var postData = req.body; 
    console.log('signup called', postData); 
    checkApiKey(req, res, function(err, done){ 
    models.user.save(postData, function(err, saved) { 
     console.log('err', err); 
     if(err) return res.status(200).json({ status: "fail", message: 'Server Error' }); 
     return res.status(200).json({ status: "success", data:saved, message: 'Success' }); 
    }) 
    }) 
} 

function checkApiKey(req, res, next){ 
    console.log('checkApiKey called'); 
    if(req.body.apiKey!='123') return res.status(200).json({ status: "fail", message: 'ApiKey not Match' }); 
    return next(req, res); 
} 

module.exports = { 
    signup, checkApiKey 
} 

はここにあるcheckApiKeyは私が

を使用するときにも、成功しサインアップすると呼ばれるが、fn.checkApiKeyを除去しながら、エラーステータス500と呼ばれていないサインアップ
router.post('/api/signup',function (req, res, next){ 
    console.log('checkApiKey called'); 
    if(req.body.apiKey!='123') return res.status(200).json({ status: "fail", message: 'ApiKey not Match' }); 
    return fn.signup(req, res); 
}); 

これは動作しますが、私は各API毎にコードを書く必要があります 誰でも正しい方法を見つけるのを助けることができます

答えて

0

これを試してください。 var app = express();

app.use(checkApiKey);それは、各呼び出しの前に呼び出します

..

1

あなたは間違っmodule.exportsを使用しています。それは次のようになります。

module.exports = { 
    signup: signup, 
    checkApiKey: checkApiKey 
} 

はまた、あなたのsignupミドルウェアの外にcheckApiKeyを取る:

function signup(req, res, next){ 
    var postData = req.body; 

    models.user.save(postData, function(err, saved) { 
    if(err) return res.status(200).json({ status: "fail", message: 'Server Error' }); 
    return res.status(200).json({ status: "success", data:saved, message: 'Success' }); 
}) 
} 

を次にこれが正常に動作する必要があります:

var fn = require('../webservices'); 
router.post('/api/signup', fn.checkApiKey, fn.signup); 
2

をExpressは、あなたがcheckAPikeyを作ることができるミドルウェアであるため、すべてのリクエストで次のコードを追加してimranと言う:

app.use((req, res, next) => { 
    if (req.body.apiKey!='123') return res.status(200).json({ status: "fail", message: 'ApiKey not Match' }); 
    next(req, res); 
}) 

app.jsまたはserver.jsに同じコードが表示されます(デフォルトでは、body-parserパッケージが設定されています(たとえば、express-generatorでスケルトンを生成する場合)。

このコードをapp.jsに入れると、最初に共有されているコードに移動し、次にnext()を使用してリクエストに渡します。

関連する問題