findById(req.params.id)返回null作为响应吗?

时间:2019-10-05 19:59:24

标签: node.js express mongoose

我的问题与其他问题不同,当我传递/:id时,我返回JSON是,这是可以的,但是问题是当我输入错误的objectId时,它返回带有statusCode 200的null值,而不是该id错误的错误。根据我的理解,由于id在数据库中不可用,因此将其称为.catch块而不是.then块。

const get_id_docs = async (req, res) => {
    await models
        .findById(req.params.id)
        .then(result => {
            res.send(result)
            })
        .catch(err => {
            res.sendStatus(404).send("Link Not Found")
        })
};

2 个答案:

答案 0 :(得分:1)

有两种情况,一种是无效的ID,另一种是有效的ID,但在数据库中不存在。

如果要区分无效的ID,可以在查询之前对其进行验证,然后返回404。

还要混合使用async等待和Promise,在这种情况下必须使用其中之一。

const mongoose = require("mongoose");

const get_id_docs = async (req, res) => {
  const isValidId = mongoose.Types.ObjectId.isValid(req.params.id);

  if (!isValidId) {
    res.status(404).send("Link Not Found - invalid id");
  }

  try {
    const result = await models.findById(req.params.id);
    if (result) {
      res.send(result);
    }
    res.status(404).send("Link Not Found - does not exists");
  } catch (err) {
    res.status(500).send(err.message);
  }
};

如果您愿意,那就赶上

const mongoose = require("mongoose");

const get_id_docs = (req, res) => {
  const isValidId = mongoose.Types.ObjectId.isValid(req.params.id);

  if (!isValidId) {
    res.status(404).send("Link Not Found - invalid id");
  }

 models.findById(req.params.id).then(result => {
         if (result) {
             res.send(result);
          }
          res.status(404).send("Link Not Found - does not exists");
     })
    .catch (err) {
        res.status(500).send(err.message);
     }
};

答案 1 :(得分:0)

您正在组成满足各种用例的各种通用库。特别是,数据库抽象框架通常会尝试在基础数据存储上对类似Facade的集合进行百分比分配。在JavaScript中,诸如Array.prototype.find之类的方法返回undefined而不是抛出错误。而且我认为猫鼬的作者正在尝试编写行为类似的API。

除了提供直观的默认行为外,通过不抛出错误,这还使更广泛的用例(例如检查是否存在)无需样板即可处理。

鉴于此,您想要以下内容

const get_id_docs = async (req, res) => {
    const result = await models.findById(req.params.id);
    if (result) {
        res.send(result);
    } 
    res.sendStatus(404).send("Link Not Found");    
 };

请注意,上述方法还有其他优点,包括它不会像404s那样任意传播其他类型的错误。