在节点中发出DELETE请求时如何修复[ERR_HTTP_HEADERS_SENT]

时间:2019-07-23 11:40:07

标签: node.js express mongoose

我有一条帖子路线,人们可以在其中添加评论。我添加功能目标是帖子的唯一ID以将其删除。该帖子被删除,但又被再次调用,我相信当它检查时,该帖子不再存在,并返回错误。在我的代码中哪里可以调用两次?

然后我检查它是否已经在数据库中删除了。

我正在学习猫鼬和路由,但是逻辑看起来不错吗?但是如果我缺少某些东西,请纠正我。

我正在使用Postman测试后端逻辑。尝试了两个不同的用户,但结果是相同的。

我的代码:

// @route   DELETE api/posts/:ID
// @desc    Delete post
// @access  private
router.delete("/:id", passport.authenticate("jwt", {session: false}), (req, res) => {
    Profile.findOne({user: req.user.id})
        .then(profile => {
            Post.findById(req.params.id)
                .then(post => {
                    //Check for post owner
                    if(post.user.toString() !== req.user.id){
                            return res.status(401).json({notauthorised: "User not authorised"});
                    }                       
                    // Delete
                    post.remove().then(() => {
                        console.log("Success 1")
                        return res.json({success: true})

                    });      
                })
                .catch(err = res.status(404).json({postnotfound: "No post found"}))
        })
})

控制台错误消息:

Success 1
(node:5228) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (D:\Google Drive\Test Lab\Projects\mernTutorial\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (D:\Google Drive\Test Lab\Projects\mernTutorial\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (D:\Google Drive\Test Lab\Projects\mernTutorial\node_modules\express\lib\response.js:267:15)
    at post.remove.then (D:\Google Drive\Test Lab\Projects\mernTutorial\routes\api\posts.js:83:36)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:5228) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with
.catch(). (rejection id: 1)
(node:5228) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

这就是导致我认为某事被两次调用的原因,因为成功1消息出现在末尾,然后出现错误。

我希望删除帖子后,它会以json字符串{success:true}响应用户,但我收到了邮递员{postnotfound:“未找到帖子”}

1 个答案:

答案 0 :(得分:0)

我能看到的唯一可能是您的错误的根本原因是

   .catch(err = res.status(404).json({postnotfound: "No post found"}))

您正在尝试在catch块的参数中声明一个变量,我认为这是不正确的,但是,您可以在catch参数中包含一个箭头函数,我相信这是此代码段中的catch。 / p>