Node Express无法返回从查询中查看的对象

时间:2013-10-06 16:20:20

标签: mongodb model-view-controller express

我正在努力:

  1. 将用户的ID传递给模型查询,该查询应从mongo返回用户记录。
  2. 将此用户对象渲染到我的视图中,以便我可以使用其字段。
  3. 我不太确定出了什么问题 - 查询功能找到了正确的用户,我可以通过console.dir查看所有字段。当我尝试用res.render将它返回到我的视图时,我什么也得不到:

    这是我的路线:

    app.get('/account', function(req, res) {
      res.render('account', {title: 'Your Account', username: req.user.name, user:account.check(req.user.id)  }); 
    });
    

    我的查询功能:

    exports.check = function(userId) { 
    MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
    if(err) throw err;
    var collection = db.collection('test'); 
    collection.findOne({userId : userId}, function(err, user) {
    if (err) throw err; 
    console.log("account.check logging found user to console: ");
    console.dir(user); 
    return user;
    
        });
     });    
    }
    

    再次,这显示正确的条目

    最后我的观点:

    <h1>Account Page</h1>
    <hr>
    <p>Why, Hello, there <b> {{username}} </b> </p><br/>
    
    <p>You came from {{user.provider}}</p>
    
    <p>{{user.lastConnected}}</p>
    
    <a href="/">Go Home</a> ~ <a href="logout">Log Out</a>
    

    任何举行的人都会非常感激!

1 个答案:

答案 0 :(得分:1)

MongoDB findOne函数是异步的(它将回调作为参数)。这意味着您的检查函数也需要是异步的,并将回调作为参数(或返回一个promise)。

然后你应该在你传递的回调中调用res.render()来查询成功。

app.get('/account', function(req, res) {

  account.check(req.user.id, function(error, user) {
    if (error) {
      // do something smart like res.status(500).end()
      return;
    }
    res.render('account', {title: 'Your Account', username: req.user.name, user:user });  
  }

});

检查功能应该是这样的:

exports.check = function(userId, callback) { 
  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
    if(err) {
       callback(err);
    }

    var collection = db.collection('test'); 
    collection.findOne({userId : userId}, function(err, user) {
      if(err) {
        callback(err);
      }

      console.log("account.check logging found user to console: ");
      console.dir(user); 

      callback(null, user);
    });
  });    
}

当然,如果您不需要进行任何其他处理,您可以将回调参数作为回调传递给collection.findOne()。我只是保持这种方式,因为它更接近你最初做的事情。