【问题标题】:Return results mongoose in find query to a variable将查找查询中的结果猫鼬返回到变量
【发布时间】:2014-07-25 00:15:55
【问题描述】:

我需要在 node.js 中返回一个带有 mongoose 的查询结果。

如何返回值以将值设置为变量?

我需要做的是:

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);
    };
});

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    您可以轻松实现这一点。

    const getUser = async ( req, res ) => {
       let users = () => ( User.find({_id : users_list[i]['user_id']},{email : 1, credits : 1}).exec() );
    
       try { res.send({"user":await users() });}
       catch(e) { console.log(e) } 
    }
    
    app.get('/user' , getUser);
    

    【讨论】:

      【解决方案2】:

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

      1.使用 Mongoose 查询

      在此策略中,您的函数返回一个 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。使用 Mongoose Promise 类对象

      Moogose 支持类似 promise 的对象。您所要做的只是与我在上面所做的有点相似,但这次您调用 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);
         });
      })
      

      正如此答案的评论部分所强调的那样,这些对象实际上并不是承诺,需要加以考虑(请参阅Queries are not promises)。

      3.使用 Mongoose 流

      最后,Mongoose 还支持流,流是事件发射器。因此,您可以获得一个流,然后订阅“数据”和“错误”事件。像这样:

      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);
      });
      

      Source,供日后参考。

      【讨论】:

      • 对您的答案进行小修改。猫鼬承诺中没有 .error 函数。当我使用它时,它会给出以下错误 - TypeError: promise.then(...).error is not a function nodejs 如果我们想要错误处理,那么我们应该做类似 mongoose.Promise = require('q').Promise ;然后使用函数 .catch(function(err) {
      • 我知道 OP 对答案很满意,但您实际上并没有解释如何将结果放入可用于其余代码的 results 变量中。
      • @vivekp:我也遇到了同样的 TypeError。请在此处更新工作代码
      • 猫鼬文档说 Query 不是 Promise mongoosejs.com/docs/queries.html#queries-are-not-promises
      【解决方案3】:

      它在赋值之前被执行。

       async function(req, res) {
            var user;
            await users.findOne({}, function(err,pro){
                user=pro;
              });
            console.log(user); \\ it's define
          };
      

      【讨论】:

      • 看起来最后一个结束括号)是不需要的。
      【解决方案4】:

      您可以通过以下代码获得所需的结果。希望这对你有很大帮助..

      var async = require('async');
      
      // custom imports
      var User = require('../models/user');
      var Article = require('../models/article');
      
      var List1Objects = User.find({});
      var List2Objects = Article.find({});
      var resourcesStack = {
          usersList: List1Objects.exec.bind(List1Objects),
          articlesList: List2Objects.exec.bind(List2Objects),
      };
      
      async.parallel(resourcesStack, function (error, resultSet){
          if (error) {
              res.status(500).send(error);
              return;
          }
          res.render('home', resultSet);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-09
        • 1970-01-01
        • 2017-12-03
        • 2020-12-16
        • 2017-05-08
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        相关资源
        最近更新 更多