在节点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));
});
答案 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引发错误。
因此,请尝试检查代码库的其他部分以调试此错误。