0

私のjsは次のとおりです。

/*
 * GET home page.
 */

var MongoClient = require('mongodb'); 

exports.index = function(req, res){
    var studentObj = {};
    MongoClient.connect("mongodb://localhost:27017/MY_DB_TEST", function(err, db) {
      if(!err) {
        console.log("We are connected");        

        var collection =  db.collection('test');        
        var stream = collection.find().stream();

        stream.on("data", function(item){
            studentObj =  item;
        });     
      }
    });
    res.render('index', { title: 'Express', obj: studentObj });
};

このページをjadeでレンダリングしようとしました。そのための私の構文は、

h1 Name: #{obj.name}

私のJSON:(mongodbから取得)

{
  name: "Ron",
  age: 24
}

これは機能しません。studentObj をグローバル変数として保持している場合、つまりrequireステートメントの後にのみ機能します。

また、obj.name最初のリクエストではレンダリングされず、2 回目以降のリクエストでのみ name プロパティを取得します。

なぜこれらの問題が発生するのですか? 私は非常に些細なことを見逃していますか?

4

2 に答える 2

3

非同期コードを同期として処理しようとしています。そうしないでください。

コードは次のとおりです。

// Declare local var
var studentObj = {};

// fire off an async request
MongoClient.connect("mongodb://localhost:27017/MY_DB_TEST", function(err, db) {

// render, not waiting for data to arrive from server
res.render('index', { title: 'Express', obj: studentObj });

これは、グローバル変数の動作についても説明しています。最初のレンダリングではまだ空ですが、2 回目のレンダリングの前にデータ リクエストが返され、グローバル変数が初期化されます。解決策は次のとおりです。データを取得した後にのみレンダリングします。

stream.on("data", function(item){
  res.render('index', { title: 'Express', obj: item });
});
于 2013-01-24T09:33:40.527 に答える
2

交換:

studentObj =  item;

と:

res.render('index', { title: 'Express', obj: item });

そして2番目を削除しres.renderます。

レンダリングは、mongodb が戻ってくるのを待ちません。これが、利用可能なデータがない理由です。

于 2013-01-24T09:31:52.747 に答える