我的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属性。
为什么会出现这些问题?我错过了一些非常微不足道的东西吗?
答案 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回来 - 这就是你没有数据的原因。