节点中的奇怪范围行为还是我在睡觉?

时间:2013-01-24 09:29:21

标签: node.js mongodb pug serverside-javascript scoping

我的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属性。

为什么会出现这些问题?我错过了一些非常微不足道的东西吗?

2 个答案:

答案 0 :(得分: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 });
});

答案 1 :(得分:2)

替换:

studentObj =  item;

使用:

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

然后删除第二个res.render

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