expression路由嵌套callback

我是新来的快递,部署一个快速的应用程序。 我想在每个调用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调用但注册不叫错误状态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都可以帮助我找出正确的方法

因为express是一个中间件,所以你可以在每个请求中添加下面的代码来做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中看到类似的代码,默认情况下,它build立了body-parser包(当你通过express-generator生成骨架的时候)。

如果你把这个代码放在app.js中,首先它会转到上面共享的代码,然后通过next()来到你的请求。

试试这个。 var app = express();

app.use(checkApiKey);

它会在每次通话之前打电话

你正在使用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);