Node.js nodejsmongodb游标问题
我有一个函数,我想返回mongo查询的值,但得到的是未定义的值。我正在尝试读取测试数据库用户集合中所有用户的电子邮件地址 这是我的代码:Node.js nodejsmongodb游标问题,node.js,mongodb,express,Node.js,Mongodb,Express,我有一个函数,我想返回mongo查询的值,但得到的是未定义的值。我正在尝试读取测试数据库用户集合中所有用户的电子邮件地址 这是我的代码: var mongo = require('mongodb').MongoClient; var connectionString = "mongodb://cannotdivulge.info.com:53778/testdb"; var users; var db = mongo.connect(connectionString, function(err,
var mongo = require('mongodb').MongoClient;
var connectionString = "mongodb://cannotdivulge.info.com:53778/testdb";
var users;
var db = mongo.connect(connectionString, function(err, db) {
if(err)
throw err;
console.log("connected to database");
users = db.collection('users');
});
exports.findAll = function(req, res) {
var cursor = users.find();
var result;
cursor.each(function(err, doc) {
if(err)
throw err;
result = doc.Email;
});
res.send(result);
};
结果应等于电子邮件地址,但未定义。未保留doc.Email的值。当我将res.send()放在cursor.each()中时,它将返回一个值
另外,在实际返回其值之前,我需要在函数中使用result变量。这就是为什么我需要保留它的值。您的
findall
函数是异步的。您只需在完成列表后返回结果。在您的代码中,函数在每个的第一次回调开始之前返回了result
的值
exports.findAll = function(req, res) {
var cursor = users.find();
var result = [];
cursor.each(function(err, doc) {
if(err)
throw err;
if (doc === null) {
// doc is null when the last document has been processed
res.send(result);
return;
}
// do something with each doc, like push Email into a results array
result.push(doc.Email);
});
};
您的
findall
函数是异步的。您只需在完成列表后返回结果。在您的代码中,函数在每个的第一次回调开始之前返回了result
的值
exports.findAll = function(req, res) {
var cursor = users.find();
var result = [];
cursor.each(function(err, doc) {
if(err)
throw err;
if (doc === null) {
// doc is null when the last document has been processed
res.send(result);
return;
}
// do something with each doc, like push Email into a results array
result.push(doc.Email);
});
};
您的
findall
函数是异步的。您只需在完成列表后返回结果。在您的代码中,函数在每个的第一次回调开始之前返回了result
的值
exports.findAll = function(req, res) {
var cursor = users.find();
var result = [];
cursor.each(function(err, doc) {
if(err)
throw err;
if (doc === null) {
// doc is null when the last document has been processed
res.send(result);
return;
}
// do something with each doc, like push Email into a results array
result.push(doc.Email);
});
};
您的
findall
函数是异步的。您只需在完成列表后返回结果。在您的代码中,函数在每个的第一次回调开始之前返回了result
的值
exports.findAll = function(req, res) {
var cursor = users.find();
var result = [];
cursor.each(function(err, doc) {
if(err)
throw err;
if (doc === null) {
// doc is null when the last document has been processed
res.send(result);
return;
}
// do something with each doc, like push Email into a results array
result.push(doc.Email);
});
};
对的如果你要抓取一堆文档,把它们放在一个数组中并发送回客户机,你可以考虑使用<代码>光标.toSoad(函数(Err,DOCs){})< /COD>,它对整个结果集进行回调。请参阅@wiredparie,但是如果我想在返回函数值之前在另一个查询中使用结果变量,该怎么办?比如说,我收到了电子邮件,我想对照另一个收集来检查它?在返回变量之前,我需要再次使用该变量。这就是为什么我需要这个值不是未定义的。等你得到结果后,再做下一步?你在问一个新问题,这似乎是?@martingreber-是的,你当然可以在某些情况下使用
toArray
。它只是在数组内部使用相同的基本技术自动执行一个非常简单的循环。它假定您有足够的RAM/内存来容纳数组结构。@WiredPairie-我没有问新问题,我想我只是一开始没有提到它,但我编辑了我的问题。无论如何,谢谢你的回答启发了我。我试图做的是检查用户的电子邮件是否正确,这样我就可以使用它(如果电子邮件是正确的)来查询数据收集,其中数据基于用户的电子邮件。正确。如果你要抓取一堆文档,把它们放在一个数组中并发送回客户机,你可以考虑使用<代码>光标.toSoad(函数(Err,DOCs){})< /COD>,它对整个结果集进行回调。请参阅@wiredparie,但是如果我想在返回函数值之前在另一个查询中使用结果变量,该怎么办?比如说,我收到了电子邮件,我想对照另一个收集来检查它?在返回变量之前,我需要再次使用该变量。这就是为什么我需要这个值不是未定义的。等你得到结果后,再做下一步?你在问一个新问题,这似乎是?@martingreber-是的,你当然可以在某些情况下使用toArray
。它只是在数组内部使用相同的基本技术自动执行一个非常简单的循环。它假定您有足够的RAM/内存来容纳数组结构。@WiredPairie-我没有问新问题,我想我只是一开始没有提到它,但我编辑了我的问题。无论如何,谢谢你的回答启发了我。我试图做的是检查用户的电子邮件是否正确,这样我就可以使用它(如果电子邮件是正确的)来查询数据收集,其中数据基于用户的电子邮件。正确。如果你要抓取一堆文档,把它们放在一个数组中并发送回客户机,你可以考虑使用<代码>光标.toSoad(函数(Err,DOCs){})< /COD>,它对整个结果集进行回调。请参阅@wiredparie,但是如果我想在返回函数值之前在另一个查询中使用结果变量,该怎么办?比如说,我收到了电子邮件,我想对照另一个收集来检查它?在返回变量之前,我需要再次使用该变量。这就是为什么我需要这个值不是未定义的。等你得到结果后,再做下一步?你在问一个新问题,这似乎是?@martingreber-是的,你当然可以在某些情况下使用toArray
。它只是在数组内部使用相同的基本技术自动执行一个非常简单的循环。它假定您有足够的RAM/内存来容纳数组结构。@WiredPairie-我没有问新问题,我想我只是一开始没有提到它,但我编辑了我的问题。无论如何,谢谢你的回答启发了我。我试图做的是检查用户的电子邮件是否正确,这样我就可以使用它(如果电子邮件是正确的)来查询数据收集,其中数据基于用户的电子邮件。正确。如果你要抓取一堆文档,把它们放在一个数组中并发送回客户机,你可以考虑使用<代码>光标.toSoad(函数(Err,DOCs){})< /COD>,它对整个结果集进行回调。请参阅@wiredparie,但是如果我想在返回函数值之前在另一个查询中使用结果变量,该怎么办?比如说,我收到了电子邮件,我想对照另一个收集来检查它?在返回变量之前,我需要再次使用该变量。这就是为什么我需要这个值不是未定义的。等你得到结果后,再做下一步?你在问一个新问题,它会