快递路线嵌套回调

时间:2016-12-16 11:11:52

标签: node.js express callback routes

我是快递,部署快递应用程序的新手。我想在每个被调用的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编写代码 任何人都可以帮我找到正确的方法

3 个答案:

答案 0 :(得分: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()转到您的请求。

答案 1 :(得分: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 :(得分:0)

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

app.use(checkApiKey);

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