无法访问mongoose find()结果的详细信息

时间:2014-01-07 07:33:44

标签: node.js mongodb mongoose

将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)向我提供了我想要的对象及其所有字段完整的事实。我读了一个类似的问题,但问题是关于异步性,因为整个事情都在回调中,我想也许情况并非如此。

1 个答案:

答案 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('/');
}