Подтвердить что ты не робот

Результаты возврата mongoose в поиске запроса к переменной

Мне нужно вернуть результаты запроса с помощью mongoose в 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);
    };
});
4b9b3361

Ответ 1

Есть несколько способов достичь того, что вы хотите.

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

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. Использование потоков Mongoose

Наконец, Mongoose также поддерживает потоки, а потоки являются источниками событий. Таким образом, вы можете получить поток, а затем подписаться на события "data" и "error". Как это:

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

Источник, для дальнейшего использования.

Ответ 2

Он выполняется перед назначением.

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

Ответ 3

Вы достигнете желаемого результата с помощью следующего кода. Надеюсь, это поможет вам очень..

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

Ответ 4

Вы можете легко достичь этого.

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