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 関数は非同期です (コールバックを引数として取ります)。これは、チェック関数も非同期で、コールバックを引数として取る (または 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() に渡すことができます。最初にやっていたことに近かったので、そのままにしておきました。

于 2013-10-06T16:28:11.647 に答える