【问题标题】:express routes nested callback快速路由嵌套回调
【发布时间】:2016-12-16 11:11:51
【问题描述】:

我是 express 的新手,正在部署一个 express 应用。我想在调用每个 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 编写代码 谁能帮我找出正确的方法

【问题讨论】:

    标签: node.js express callback routes


    【解决方案1】:

    因为 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() 转到您的请求。

    【讨论】:

      【解决方案2】:

      你用错了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);
      

      【讨论】:

        【解决方案3】:

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

        app.use(checkApiKey);

        它会在每次调用之前调用..

        【讨论】:

          猜你喜欢
          • 2021-04-05
          • 1970-01-01
          • 2018-11-07
          • 1970-01-01
          • 1970-01-01
          • 2020-11-13
          • 2016-07-22
          • 2015-10-07
          • 1970-01-01
          相关资源
          最近更新 更多