【问题标题】:Node JS throwing cannot set headers after they are sent to the client, after using mongoose.removeOne使用 mongoose.removeOne 后,Node JS throwing 在发送到客户端后无法设置标头
【发布时间】:2020-05-30 20:15:54
【问题描述】:

我有一个删除产品的方法,在它执行之前检查尝试删除产品的用户是否是创建它的用户。当我使用 Insomnia 执行它时,它成功删除了产品,但我在控制台上收到错误消息,提示无法在将标头发送到客户端后设置标头。

我的方法:

exports.deleteProduct = (req, res) => {
  const id = req.params.productId;
  Product.deleteOne({ _id: id, userId: req.user._id }, () => {
    return res.status(401).json("Not authorized");
  })
    .then(() => {
      return res.status(200).json("Product deleted");
    })
    .catch((err) => {
      return res.status(500).json({
        error: err,
      });
    });
};

我很确定这正在发生,因为我在执行后链接了 .then() 和 .catch()。

我尝试这样做,但没有成功,因为我发送给回调函数的 err 参数为空。:

exports.deleteProduct = (req, res) => {
  const id = req.params.productId;
  Product.deleteOne({ _id: id, userId: req.user._id }, (err) => {
    if (err) {
      return res.status(401).json("Not authorized");
    }
    return res.status(200).json("Product deleted");
  });
};

当我尝试第二种方法时,我总是得到 200 状态,同时产品没有删除。

知道如何处理吗?

【问题讨论】:

  • 第二种方法是正确的方法,因为您不会发送两次响应。产品没有被删除的原因是您查询的产品不匹配。使用相同的查询尝试Product.findOne()。你应该看到它的null
  • @thammada 实际上并没有删除产品,因为 userId 不一样。我只需要帮助修复,所以它会抛出正确的消息而不是 200。
  • 回调接受errorresult,所以你应该可以通过(err, result) => ...并检查result的值

标签: javascript node.js mongodb mongoose


【解决方案1】:

你可以试试这样的:

Product.deleteOne({ _id: id, userId: req.user._id }, (err, result) => {
   if(err) {
      return "something"
   }
   return "something else"
});

或者:以异步/等待方式

try {
  await Product.deleteOne({ _id: id, userId: req.user._id });
} catch (err) {
  // handle error here
}

顺便问一下,你为什么要在deleteOne 方法中传递userId

【讨论】:

  • 我需要检查试图删除产品的用户是否创建了它。所以我在里面传递了userId。
猜你喜欢
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
相关资源
最近更新 更多