我的问题与其他问题不同,当我传递/: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")
})
};
答案 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那样任意传播其他类型的错误。