将Node / Express与MongoDB一起使用,我试图找出是否存在具有特定字段名称的对象。
我认为数据库连接本身是正常的,因为我可以将数据添加到数据库中(通过运行应用程序然后通过mongo shell进行检查确认)
以下代码应将student
的字段Class
增加1,如果我受到热播,请继续执行下一页/nextpage
。
exports.join = function(req,res,next){
Class.find(({code:{$in: [req.body.roomNumber]}}), function(err, out){
if(err){res.redirect('/'); next(err);}
else{
console.log(out); // returns the whole object from db.
// for no match, I get "[]"
console.log(req.body.formEntry); // returns the entered form value OK
console.log(out.roomNumber); // always returns "undefined"; why?
if(out != null) { // always passes
console.log('adding 1 to students');
Class.update({code:req.body.formEntry}, {$inc:{'students':1}}); // also didn't work
res.redirect('/nextpage');
}else{
console.log('class not found');
}
}
};
}
我已经尝试过检查out.params.roomNumber
(获取未定义)或out.next()
(认为这是一个查询)之类的内容,但我对console.log(out.roomNumber)
的输出感到困惑(总是未定义)考虑到console.log(out)
向我提供了我想要的对象及其所有字段完整的事实。我读了一个类似的问题,但问题是关于异步性,因为整个事情都在回调中,我想也许情况并非如此。
答案 0 :(得分:1)
find
返回一个结果数组,因此out
是一个数组。
如果每个班级都有唯一的房间号码,那么使用findOne
更有意义:
Class.findOne({ code : req.body.roomNumber }, function(err, out) {
// `out` is now a single result, provided there was a match
...
});
此外,使用$in
来匹配单个房间号码有点多余,所以我将其从查询中删除(类似于您用于update
的查询)。
另外,您不应将res.redirect()
和next()
混合在一起(因为发送重定向会结束请求,但next
会将其传递给其他处理程序,这会触发错误表达)。我建议使用这个:
if (err) {
return res.redirect('/');
}