首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Express.js路由错误:发送后无法设置标头

Express.js路由错误:发送后无法设置标头
EN

Stack Overflow用户
提问于 2016-01-25 08:48:31
回答 6查看 85.4K关注 0票数 26

我真的不确定为什么我会得到这个错误。这是一个建立在express.js上的简单应用程序接口,可以添加和删除帖子。当我触发删除路由器时出现错误。我读到错误通常发生在有两个回调时,然而,我似乎找不到任何双重回调。

代码语言:javascript
复制
    _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路由器:

代码语言:javascript
复制
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!' });
            });
        });
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-01-25 09:01:20

你需要添加'return‘,这样你就不会回复两次。

代码语言:javascript
复制
// save post and check for errors
post.save(function(err) {
    if (err) {
        return res.send();
    }
    res.json({ message: 'post created!' });
});
票数 70
EN

Stack Overflow用户

发布于 2016-01-25 08:56:13

该特定错误消息几乎总是由于处理异步响应时的计时错误而导致的,该错误导致您在响应已经发送之后尝试发送响应上的数据。

当人们将快速路由中的异步响应视为同步响应,并最终发送两次数据时,通常会发生这种情况。

我看到的一个地方是在你的错误路径中:

执行此操作时:

代码语言:javascript
复制
       // 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(...)。您的代码需要有一个returnelse,所以当出现错误时,您不能同时执行这两个代码路径。

票数 17
EN

Stack Overflow用户

发布于 2016-01-25 08:56:16

因此,当res.sendres.json尝试发送两次res.end时,在Express中可能会发生这种情况。在您的if(err)代码块中,您将希望在res.send异步运行时执行return res.send(),并且res.json也会被调用。我想知道您的delete路由中是否有错误?希望这能有所帮助。

最好的!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34983520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档