2017-04-16 112 views
0

我目前正在使用mongodb/mongoose进行一个项目,每次我故意查询DB中不存在的内容时,我都会收到一个空数组的响应。这是我用快递建立的API,并返回在数据库中找到的数据代码:MongoDB/Mongoose返回空数组

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(我有作业ID没有对象: 67在数据库中),控制台不打印错误。它给了我一个空数组的JSON响应。任何想法为什么发生这种情况?奇怪的是,当我将jobID: id更改为_id: id时,它确实给了我一个错误。为什么不这样做jobID字段?

编辑:只是为了澄清,我不希望这种行为的原因是因为我的程序将永远不会打印错误,即使我的数据库中的作业不存在与指定的jobID。

回答

0

关于错误,当你试图找到它的__id的东西:它给你一个错误,因为__id不是字符串,它的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); 
    } 
    }); 
}); 

编辑:我没有意识到,你检查错误,我改变了代码。

+0

这产生了和以前相同的结果:/ – calviners

+0

@calviners我编辑了代码,现在就试试。 – someRandomSerbianGuy

+0

@calviners我第三次编辑它。这应该工作100%。 – someRandomSerbianGuy

1

它做的事情与你认为的不同。

Job.find({jobID: id}, ...) 

这究竟说的是给我阵列都在收集"Job"有场"jobID"等于某个值文件。

如果没有这样的文件会怎么样?那么,数组将是空的。当然,没有任何错误,这里应该是错误的?您要求提供所有文档(给定一些过滤器),并返回包含所有这些文档的数组。数组的大小是零,这只是一个巧合,因为没有这样的文档。

如果你想检查是否没有这样的文件,然后检查数组是否为空。

我不知道为什么当你将JobID更改为_id时给你错误;究竟是什么错误?

如果您只对一个文档感兴趣,则存在方法findOne,该方法仅返回第一个文档(如果不存在此类文档,则返回null)而不是数组。

+0

谢谢!你的解释让我更了解它,然后我添加了这个条件语句来解决它:else if(!res.length)console.log(“Nothing found”); } – calviners

0

返回空字符串是猫鼬的正常行为。您应该如下处理您的回复:

if (err) { 
    //handle error 
} else if (foundJob) { 
    //work with your data 
} else { 
    //nothing was found 
} 

您使用_id得到的错误必须是无关紧要的,可能是由于无效查询造成的。

+0

这不起作用:/相同的结果 – calviners

+0

通过说相同的结果你到底什么意思?即使你的数组​​是空的,你是否进入了else if(foundJob){}? – itsundefined