我需要在node.js中用猫鼬返回查询的结果。
如何返回值以将值设置为变量?
我需要做的是:
var results = users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) { if( err || !docs) { console.log("No user found"); } else { return docs; }; });
为了有:
results = docs
非常感谢您的回复 。
我还有另一个问题。
如何使用find或findOne在查询运算符中传递变量?喜欢 :
var foo = "Blaa"; users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) { if( err || !docs) { console.log("No user found"); } else { // I want to use the foo variable here console.log(foo); }; });
有几种方法可以实现您想要的。
1.使用猫鼬查询
在这种策略中,您的函数返回一个Mongoose查询,您以后可以exec使用它来调用该方法并使用它来获取结果。
exec
function getJedisQuery(name){ var query = Jedi.find({name:name}); return query; }
然后,您可以简单地使用它:
var query = getJedisQuery('Obi-wan'); query.exec(function(err,jedis){ if(err) return console.log(err); jedis.forEach(function(jedi){ console.log(jedi.name); }); });
2.使用类似猫鼬的诺言对象
Moogose为类似诺言的对象提供支持。您所要做的只是有点类似于我在上面所做的事情,但是这次,您在exec没有回调的情况下调用了该方法。
function getJedisPromise(name){ var promise = Jedi.find({name:name}).exec(); return promise; }
然后,您只需执行以下操作即可使用它:
var promise = getJedisPromise('Luke'); promise.then(function(jedis){ jedis.forEach(function(jedi){ console.log(jedi.name); }); })
正如此答案的注释部分中突出显示的那样,这些对象实际上不是诺言,需要考虑在内(请参阅查询不是诺言)。
3.使用猫鼬流
最后,猫鼬还支持流,并且流是事件发射器。因此,您可以获取流,然后订阅“数据”和“错误”事件。像这样:
function getjedisStream(name){ var stream = Jedi.find({name:name}).stream(); return stream; }
然后,您可以简单地执行以下操作:
var stream = getJedisStream('Anakin'); stream.on('data', function(jedis){ jedis.forEach(function(jedi){ console.log(jedi.name); }); }); stream.on('error', function(error){ console.log(error); });
来源,以供将来参考。