0

我试图:

  1. 将用户 ID 传递给模型查询,该查询应该从 mongo 返回用户记录。
  2. 将此用户对象呈现给我的视图,以便我可以使用它的字段。

我不太确定出了什么问题 - 查询功能找到了正确的用户,我可以通过 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>

任何举行将不胜感激!

4

1 回答 1

1

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

然后你应该在你传递给成功查询的回调中调用 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()。我只是保持这种方式,因为它更接近你最初所做的。

于 2013-10-06T16:28:11.647 回答