Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js get中的自定义回调_Node.js_Express - Fatal编程技术网

Node.js Express.js get中的自定义回调

Node.js Express.js get中的自定义回调,node.js,express,Node.js,Express,我的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({

我的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调用调用我的回调?

您只需包装该函数即可插入附加的函数参数:

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

Express中的第三个arity总是保留给
next()
callback(在中间件中可以找到)。 如果你想“回调”,但又不想搞砸express,那就让我们黑客吧

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中的导出节点_ENV=testExpress中的第三个arity总是保留给
next()
callback(如中间件中所示)Express仍将使用三个参数调用处理程序,即使您没有声明第三个回调函数,Thakk you@robertklep+1但是
回调函数
仍然是Express传递的
下一个
回调函数,而不是用户提供的回调函数…
if(process.env.NODE_env=='test')
,这意味着在生产环境中,该函数不会被调用,也不会造成任何伤害,在(单元)测试中,开发人员直接测试导出人员