2016-12-16 5 views
1

Я новичок в экспресс, развертывая экспресс-приложение. я хотел бы вызвать функцию checkApiKey перед каждым вызовом api. вот мой 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 называется, но SIGNUP не называется состояние ошибки 500 при удалении fn.checkApiKey затем подписаться преуспевающим также, когда я использую

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();

приложение.use (checkApiKey);

он призовет перед каждым вызовом ..

1

Вы используете module.exports неправильно. Оно должно быть:

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

Также возьмите checkApiKey из вашего signup промежуточного слоя:

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

Поскольку экспресс является промежуточным слоем вы можете сделать checkAPikey в каждом запросе путем добавления следующего кода в качестве имрана:

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 (например, при сгенерировании скелета через экспресс-генератор).

Если вы поместите этот код в app.js, сначала он перейдет к коду, разделяемому сверху, а затем к вашему запросу через next().