获得Express.js中的自定义回调

时间:2014-01-25 15:01:51

标签: node.js express

我的app.js

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.

我如何打电话回电话?

2 个答案:

答案 0 :(得分:2)

您可以将该函数包装为插入附加函数参数:

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

答案 1 :(得分:0)

Express中的第三个arity始终保留用于next()回调(如中间件中所示)。 如果你想要“回调”,但又不想搞砸快递,那就试试吧!

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

然后,当您要测试shell中的export NODE_ENV=test