一尘不染

将查找查询中的结果猫鼬返回给变量

node.js

我需要在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);
    };
});

阅读 198

收藏
2020-07-07

共1个答案

一尘不染

有几种方法可以实现您想要的。

1.使用猫鼬查询

在这种策略中,您的函数返回一个Mongoose查询,您以后可以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);
});

来源,以供将来参考。

2020-07-07