【问题标题】:Custom callback in Express.js getExpress.js 中的自定义回调
【发布时间】:2014-01-25 15:01:50
【问题描述】:

我的 app.js 中有一个 get

app.get('/api/personnel', api.personnel);

调用此函数作为回调从 mongo 加载一些数据:

exports.personnel = function(req, res) {
  var docs;
  db.personnel.find(function(err, docs) {
    if (err) {
      logError(err);
    } else {
      res.json({
        personnel: docs
      });
    }
  });

};

这很好用,但我真的希望能够在函数完成时调用回调以进行测试:

exports.personnel = function(req, res, callback) {
  var docs;
  db.personnel.find(function(err, docs) {
    if (err) {
      logError(err);
    } else {
      res.json({
        personnel: docs
      });
    }
    callback();
  });

从实时应用程序调用该函数时callback() 为空并给我一个错误:

Error: Can't set headers after they are sent.

如何让 get 调用我的回调?

【问题讨论】:

  • Express 中的第三个参数总是为next() 回调保留(在中间件中找到)

标签: node.js express


【解决方案1】:

您可以包装该函数以插入额外的函数参数:

exports.personnel = function(req, res, callback) {
  var docs;
  db.personnel.find(function(err, docs) {
    if (err) {
      logError(err);
    } else {
      res.json({
        personnel: docs
      });
    }
  });
///////////////////////////////////////////////////

var callback = ...;
pp.get('/api/personnel', function(req, res) {
     api.personnel(req, res, callback);
});

【讨论】:

    【解决方案2】:

    Express 中的第三个参数总是为next() 回调保留(在中间件中可以找到)。 如果你想有“回调”但又不想搞乱 express,让我们hack吧!

    exports.personnel = function(req, res, callback) {
      var docs;
      db.personnel.find(function(err, docs) {
        if (err) {
          logError(err);
        } else {
          res.json({
            personnel: docs
          });
        }
        if(process.env.NODE_ENV === 'test')
          callback();
      });
    

    然后,当你想测试时,export NODE_ENV=test 在你的 shell 中

    【讨论】:

    • Express 仍然会使用三个参数调用处理程序,即使您没有声明第三个参数。
    • 谢谢@robertklep +1
    • callback 仍将是 Express 传递的 next 回调,而不是用户提供的回调...
    • if(process.env.NODE_ENV === 'test'),表示在生产中,这个函数不会被调用,也不会造成任何伤害,而在(单元)测试中,开发者直接测试exports.personnel
    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多