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在第一次请求时不会呈现,只有从第二次请求开始,我才能获得 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 });

这也解释了全局变量的行为。第一次渲染它仍然是空的,但在第二次渲染之前数据请求返回并初始化全局变量。解决方案是:只有在获得数据后才渲染。

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 });

并删除第二个res.render.

渲染不会等待 mongodb 回来——这就是你没有可用数据的原因。

于 2013-01-24T09:31:52.747 回答