我目前正在使用mongodb / mongoose进行项目,每当我故意查询数据库中不存在的内容时,我都会收到一个空数组的响应。这是我使用Express设置API并返回DB中的数据的代码:
app.get('/api/:id', function(req, res) {
var id = req.params.id;
Job.find({jobID: id}, function (err, foundJob) {
if (err) {
console.log(err);
}
else {
res.json(foundJob);
}
});
});
但是,每次我去localhost:3000 / api / 67(我的数据库中没有jobID:67的对象),控制台不会打印错误。它给了我一个空数组的JSON响应。为什么会发生这种情况的任何想法?奇怪的是,当我将jobID: id
更改为_id: id
时,它确实给了我一个错误。为什么不对jobID
字段执行此操作?
编辑:只是为了澄清,我不想要这种行为的原因是因为我的程序永远不会打印错误,即使我的数据库中的作业不存在该指定的jobID。
答案 0 :(得分:1)
它做的事情与你想象的不同。
Job.find({jobID: id}, ... )
这真的是给我数组,其中包含集合"Job"
中所有文件,其中"jobID"
字段等于某个值。
如果没有这样的文件怎么办?那么,数组将是空的。当然,没有任何错误,这里应该是什么错误?您询问了所有文档(给定了一些过滤器),并返回了包含所有此类文档的数组。只是巧合的是,数组的大小为零,因为没有这样的文档。
如果要检查是否没有此类文档,请检查该数组是否为空。
当您将JobID
更改为_id
时,我不知道为什么会出错。究竟是什么错误?
如果您只对一个文档感兴趣,那么方法findOne只返回第一个文档(如果不存在此类文档,则返回null
)而不是数组。
答案 1 :(得分:0)
当您尝试通过__id查找某些内容时出现错误:它会给您一个错误,因为__id不是String,它是ObjectId。因此,您应该使用__id搜索文档,如下所示:_id: ObjectId(id)
关于空字符串:如果要显示某种不同的消息,则应检查db是否返回了某些内容,或者它是否为返回的空字符串。像这样:
app.get('/api/:id', function(req, res) {
var id = req.params.id;
Job.find({jobID: id}, function (err, foundJob) {
if(foundJob){
res.json(foundJob);
}else{
res.json("nothing found");
}
if (err) {
console.log(err);
}
});
});
编辑:我没有意识到你检查过错误,我改变了代码。
答案 2 :(得分:0)
返回空字符串是mongoose的正常行为。您应该像这样处理您的回复:
if (err) {
//handle error
} else if (foundJob) {
//work with your data
} else {
//nothing was found
}
_id带来的错误必须是无关紧要的,可能是由于查询无效。