我是nodejs的新手,但我确实在昨晚使用iisnode在IIS服务器上使用mongodb工作。 :)
但我想知道一件事似乎是一个刷新错误或其他什么。 当我去" http://localhost/mongo.js"在我的浏览器中,结果将是" []"第一次。如果我点击刷新,结果将是我所期望的(带有人的json数组)。 Dosen这似乎不对?
现在让我们说一下查询," http://localhost/mongo.js?name = Daniel",并获取名为Daniel的所有人员。第一次回复将是"所有人"因为那是我们上面要求的,当我点击刷新时,结果将是所有名为丹尼尔的人。 为什么会这样? 似乎服务器缓存了我已经制作的查询,并且我不想每次都刷新以获得正确的结果。
这是我正在使用的代码:(也可在此处http://pastebin.com/PnVfrQmh)
/* GLOBALS
----------------------------------------------------------------------*/
var rdata = [];
/* SERVER SETTINGS
----------------------------------------------------------------------*/
//load http module to ceate an http server.
var http = require('http');
var url = require('url');
//configure to respond http server with message
http.createServer(function (request, response) {
//request name parameter
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
//do the mongo
var mongo = require('mongodb');
var db = new mongo.Db('nodedb', new mongo.Server('localhost', 27017, {}), {});
db.open(function() {
db.collection('Persons', function(err, collection) {
var cursor = collection.find(query);
cursor.each(function(err, doc) {
if(doc) {
rdata.push(doc);
}
});
});
});
//write what type of response
response.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});
//return data json array
response.end(JSON.stringify(rdata));
//clear rdata
rdata = [];
}).listen(process.env.PORT);
答案 0 :(得分:4)
您必须记住,您始终与node.js处于异步世界。这也引起了我的同步背景。
这里发生的是您的响应在逻辑运行之前返回。这是因为当你调用db.open(function() {
时,这会在事件循环中继续并返回。这是非阻塞的,因此运行的下一行代码是response.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});
。然后在将来的某个时间调用db.open
的回调。
为了纠正这个问题。在cursor.each(function(err, doc) {
循环结束后返回响应。
希望这有帮助。