RESTful API 对于 HTTP DELETE 不检查 null

RESTful API for HTTP DELETE doesnt check for null

我目前正在为 Web 服务编写 RESTful API,但我遇到了问题。我正在尝试 删除 一封邮件,但首先我想检查邮件是否 存在 。我的问题是它不检查 mail 是否为空并且不响应 404。我正在使用 expressmongoose

router.delete('/:id', (req, res) => {
    const { id } = req.params;
    Mail.findById(id)
      .exec()
      .then((mail) => {
        if (!mail) {
          console.log(mail) // returns null
          return res.status(404);
        }
      })
      .then(
        Mail.deleteOne({ _id: id })
          .exec()
          .then(() => {
            res.status(200).json({
              message: 'Mail deleted',
            });
          })
          .catch((err) => {
            res.status(500).json({ error: err });
          })
      );
  });

我认为您必须将第一个 then 块中代码的删除部分作为 else 语句来执行。您不会返回下一个 then 块可以使用的任何内容。

你可以这样做:

Mail.findById(id)
      .exec()
      .then((mail) => {
        if (!mail) {
          console.log(mail) // returns null
          return res.status(404).send() //need to send response;
        }
        Mail.deleteOne({ _id: id })
          .exec()
          .then(() => {
            res.status(200).json({
              message: 'Mail deleted',
            });
          })
      }).catch((err) => {
            res.status(500).json({ error: err });
      })

专业提示:如果您不知道,请学习异步等待。代码看起来会更简洁!

然后它看起来像这样:

router.delete('/:id', async (req, res) => {
    const { id } = req.params;

    try {
      const mail = await Mail.findById(id);
      if(!mail) {
         return res.status(404).send();
      }

      await Mail.deleteOne({_id: id});      
      res.status(200).json({
              message: 'Mail deleted',
            });
    } catch(e) {
      res.status(500).json({ error: err });
    }