错误:发送标头后无法设置标头。在节点js中

时间:2019-05-14 07:25:29

标签: node.js mongodb

在节点js中是新消息,当我尝试从react将数据发送到数据库时,在我的节点js上出现错误“发送后无法设置标头”。我一直在寻找类似的问题,但这并不能帮助我解决这个问题

我尝试在帖子(第二个)上使用writeHead 但这无济于事,是我发送了同一张图片吗?发送相同的图片我只会遇到问题

app.post('/list', function(req, res){
    const {namaCabor, descCabor, imgCabor } = req.body;
    connectDb.collection('listCabangOlahraga').insertOne(req.body, function(err, res){
        console.log(res.insertedCount +'data inserted');
    });
    res.send(req.body);
});

app.post('/add', function(req, res){
    const {categoryName, categoryDesc, categoryImage, namaCabor, descCabor, imgCabor } = req.body;
    connectDb.collection('listCategoryCabangOlahraga').insertOne(req.body, function(err, res){
        console.log(res.insertedCount +'data inserted'); 
        if(err) throw err;
    });
    res.writeHead(200, {'Content-Type' : 'application/json'});
    res.end(JSON.stringify(req.body));
});

3 个答案:

答案 0 :(得分:1)

快速分析:您的代码涉及写入MongoDB集合。它有一个异步回调。我想res.write()/ res.send()应该包含在回调中?

如果没有,它们甚至在数据库操作完成之前就被执行了,我们不知道它是否成功。

app.post('/list', function(req, res){
    const {namaCabor, descCabor, imgCabor } = req.body;
    connectDb.collection('listCabangOlahraga').insertOne(req.body, function(err, res){
        console.log(res.insertedCount +'data inserted');
        // <----- Handle the error here and print response accordingly.
    });
    res.send(req.body); //Move this inside callback. Return error response if err encountered.
});

app.post('/add', function(req, res){
    const {categoryName, categoryDesc, categoryImage, namaCabor, descCabor, imgCabor } = req.body;
    connectDb.collection('listCategoryCabangOlahraga').insertOne(req.body, function(err, res){
        console.log(res.insertedCount +'data inserted'); 
        if(err) throw err;
        // <----- Handle the error here and print response accordingly.
    });
    res.writeHead(200, {'Content-Type' : 'application/json'}); // Move this inside callback.
    res.end(JSON.stringify(req.body)); //Write response from the callback.
});

基本上会出现错误,因为在设置标题之前调用了res.write()/ res.send()

另外,在任何一个地方重命名res对象也是一个好主意(也许可以重命名MongoDB write回调中的res(结果)对象,以避免与res造成混淆快速路线的(响应)对象

答案 1 :(得分:0)

我邀请您,您有一个错误处理程序。在/ add路由中,它将引发错误,并且您的错误处理程序将捕获该错误。因此,您尝试在/ add处理程序和错误处理程序中都设置了响应标头。第二个处理程序将抛出错误'发送后无法设置标头,因为响应已在第一个处理程序中发送(可能是错误处理程序或/ add处理程序)

答案 2 :(得分:0)

每当节点在发送http响应后尝试发送它,就会发生此错误, 例如

{if(true){
res.send({})
}
res.send({
// this will throw that error because the pool is already close because the first res.send was executed.
});
}

但是,在您所发布的代码中,这种情况下看不到, 但是在server.js中,执行的方法可能已将响应发送到前端,并且在路由控制器完成处理之前关闭了池,从而导致代码中的res.send或res.end引发错误。

因此,请尝试检查代码库的其他部分以调试此错误。