我不确定为什么我会收到此错误。这是一个基于express.js构建的简单API,可以添加和删除帖子。当我触发删除路由器时发生错误。我已经读过,当有两个回调时,通常会发生错误,但是,我似乎无法找到任何双回调。
_http_outgoing.js:344
throw new Error('Can\'t set headers after they are sent.');
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
at ServerResponse.header (/Users/bounty/Projects/_learning/react-express/node_modules/express/lib/response.js:718:10)
at ServerResponse.send (/Users/bounty/Projects/_learning/react-express/node_modules/express/lib/response.js:163:12)
at ServerResponse.json (/Users/bounty/Projects/_learning/react-express/node_modules/express/lib/response.js:249:15)
at /Users/bounty/Projects/_learning/react-express/server/routes/posts.js:86:9
at nextTickCallbackWith0Args (node.js:452:9)
at process._tickCallback (node.js:381:13)
这是我的posts.js路由器:
module.exports = function(router) {
var Post = require('../models/post.js');
// middleware for the api requests
router.use(function(req, res, next) {
// do logging
console.log('something is happening.');
next(); // make sure we go to our next route and don't stop here
});
// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router.get('/', function(req, res) {
res.json({ message: 'hooray! welcome to our api!' });
});
// all routes here
// routes that end in /posts
router.route('/posts')
// create a Post (accessed at POST http://localhost:7777/api/posts)
.post(function(req, res) {
var post = new Post();
post.postTitle = req.body.postTitle; // set the post name (comes from request)
// save post and check for errors
post.save(function(err) {
if (err)
res.send();
res.json({ message: 'post created!' });
});
})
// get all Posts (accessed at GET http://localhost:7777/api/posts)
.get(function(req, res) {
Post.find(function(err, posts) {
if (err)
res.send();
res.json(posts);
});
});
// routes that end in /posts for specific id
router.route('/posts/:post_id')
// get the post with that id
.get(function(req, res) {
Post.findById(req.params.post_id, function(err, post) {
if (err)
res.send(err);
res.json(post);
});
})
// update the post with that id
.put(function(req, res) {
Post.findById(req.params.post_id, function(err, post) {
if (err)
res.send(err);
post.postTitle = req.body.postTitle;
// save the post
post.save(function(err) {
if (err)
res.send(err);
res.json({ message: 'post updated!' });
});
});
})
// deletes the post with that id
.delete(function(req, res) {
Post.remove({
_id: req.params.post_id
}, function(err, post) {
if (err) {
res.send(err);
}
res.json({ message: 'post deleted!' });
});
});
}
答案 0 :(得分:58)
您需要添加“返回”,这样您才不会回复两次。
// save post and check for errors
post.save(function(err) {
if (err) {
return res.send();
}
res.json({ message: 'post created!' });
});
答案 1 :(得分:13)
由于异步响应处理中的计时错误导致您在响应已经发送后尝试发送响应数据,因此几乎总是会导致该特定错误消息。
当人们将快速路由中的异步响应视为同步响应并且最终发送数据两次时,通常会发生这种情况。
我看到你会得到一个地方就是你的错误路径:
执行此操作时:
// save post and check for errors
post.save(function(err) {
if (err)
res.send();
res.json({ message: 'post created!' });
});
如果post.save()
生成错误,您将执行res.send()
,然后您将res.json(...)
之后执行此操作。您的代码需要有return
或else
,因此如果出现错误,您就不会执行这两个代码路径。
答案 2 :(得分:5)
因此,在尝试发送res.end
两次res.send
和res.json
时,Express会发生这种情况。在if(err)
块中,您需要return res.send()
,因为res.send
异步运行,res.json
也会被调用。我想知道你的delete
路线是否收到错误?希望这会有所帮助。
最佳!
答案 3 :(得分:3)
您在同一请求中使用res.send()
或res.json()
两次
首先发送标题,然后是响应主体,然后再重新发送标题。
req.next
通常不是函数,next
作为中间件的第三个参数传递。如果您想要放入下一个中间件,请使用它。 (假设您使用的是Express框架)
答案 4 :(得分:1)
为了完整起见,我还要提到:
有时问题可能出在您可能通过调用使用的中间件中
app.use
。
检查前面答案中提到的明显错误后:
您应该删除所有app.use
语句,然后逐个重新引入它们,以找到有问题的模块。
答案 5 :(得分:0)
If you are using res.send() inside any loop, then you need to break it after the use of res.send(). So that it won't allow resetting of the res headers again and again.
for e.g :
for(){
if(){
res.send();
break;
}
else(){
res.send();
break;
}
}
In my case this is the problem and I solved it like this.
Hope it may help someone in future.
Thanks