发送后不能设置标头

时间:2017-04-26 08:06:46

标签: javascript node.js mongodb express

我试图在我的代码中找到错误,其他主题都没有。

有app.js代码,其中包含来自Express模块​​的get方法:

app.get('/notes', notesController.all);

有notesController.js代码,导出到app.js create方法:

exports.all = function (req, res) {
    Notes.all(function(err, docs){
        if(err){
            console.log(err);
            return res.sendStatus(500);
        }
        res.send(docs);
    })
};

model此代码:

exports.all = function (cb) {
    db.get().collection('notes').find().toArray(function (err, docs) {
        cb(err,docs);
    })
};

应用程序崩溃时出现此错误:

process.nextTick(function() { throw err; });
                              ^
     

错误:发送后无法设置标头。       在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:357:11)       在ServerResponse.header(O:\ OGPI6 \ node_modules \ express \ lib \ response.js:725:10)       在ServerResponse.json(O:\ OGPI6 \ node_modules \ express \ lib \ response.js:253:10)       在ServerResponse.send(O:\ OGPI6 \ node_modules \ express \ lib \ response.js:158:21)       在O:\ OGPI6 \ controllers \ notes.js:9:13       在O:\ OGPI6 \ models \ notes.js:6:9       在handleCallback(O:\ OGPI6 \ node_modules \ mongodb \ lib \ utils.js:120:56)       在O:\ OGPI6 \ node_modules \ mongodb \ lib \ cursor.js:860:16       at handleCallback(O:\ OGPI6 \ node_modules \ mongodb-core \ lib \ cursor.js:171:5)       at setCursorDeadAndNotified(O:\ OGPI6 \ node_modules \ mongodb-core \ lib \ cursor.js:505:3)

在我看来,回调函数中只有“controller”错误:

if(err){
            console.log(err);
            return res.sendStatus(500);
        }
        res.send(docs);

但我认为当发生错误时它必须终止函数并返回sendStatus(500),但在控制台中记录错误后它会尝试返回res.send(docs),然后应用程序崩溃,因为它正在发送第二个标题。它看起来很好,但不起作用。任何人都可以指出我失败了吗?

2 个答案:

答案 0 :(得分:2)

使用" next"中间件中的参数使表达知道该中间件的目的已经完成,并且不再需要执行代码。

exports.all = function (req, res, next) {
    Notes.all(function(err, docs){
        if(err){
            console.log(err);
            res.sendStatus(500);
            return next();
        }
        res.send(docs);
    })
};

返回后执行代码可能是由于异步性质。

您也可以使用else阻止。

exports.all = function (req, res, next) {
        Notes.all(function(err, docs){
            if(err){
                console.log(err);
                res.sendStatus(500);

            }
            else res.send(docs);
        })
    };

答案 1 :(得分:0)

将代码更改为

if(err){
  console.log(err);
  return res.status(500).send(err);
}
res.send(docs);