我不确定为什么我会收到这个错误.这是一个基于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)
Run Code Online (Sandbox Code Playgroud)
这是我的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!' });
});
});
}
Run Code Online (Sandbox Code Playgroud)
Gad*_*adi 59
您需要添加"返回",这样您才不会回复两次.
// save post and check for errors
post.save(function(err) {
if (err) {
return res.send();
}
res.json({ message: 'post created!' });
});
Run Code Online (Sandbox Code Playgroud)
jfr*_*d00 13
由于处理异步响应时出现计时错误导致您在响应已经发送后尝试发送响应数据,因此几乎总是会导致该特定错误消息.
当人们将快速路由中的异步响应视为同步响应并且最终发送两次数据时,通常会发生这种情况.
我看到你会得到一个地方就是你的错误路径:
当你这样做:
// save post and check for errors
post.save(function(err) {
if (err)
res.send();
res.json({ message: 'post created!' });
});
Run Code Online (Sandbox Code Playgroud)
如果post.save()生成错误,您将执行res.send(),然后您将执行res.json(...)此操作.当出现错误时,您的代码需要有一个return或else那样的代码路径.
因此,这可以尝试发送时,在快速发生res.end两次,其res.send和res.json都这样做.在您的if(err)块中,您将希望以异步return res.send()方式res.send运行并且res.json也会被调用.我想知道你的delete路线是否有错误?希望这可以帮助.
最好!
| 归档时间: |
|
| 查看次数: |
69945 次 |
| 最近记录: |