2015-04-17 5 views
1

Я работаю над Restful API с node.js и mongoose. Мне нужно вернуть объект с результатами поиска. Вот мой код:Вернуть результат функции модели mongoose

var Get = function (criteria) {  
    var result; 
    Users.findOne(criteria, function(err, res){ 
     console.log('Error: ' + err); 
     console.log('Results: ' + res); 
     result = err || !res ? err || errors['404']: res; 
     console.log(result); 
    }); 
    console.log('Final results: ' + JSON.stringify(result)); 
    return result; 
}; 

Поскольку у меня были проблемы, я добавил эти console.logs, чтобы посмотреть, где результат теряется. Вот журналы:

Final results: undefined Error: null Results: { //user... }

Мне нужно, что результат должен быть возвращен. Как я могу это решить?

+0

[Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) –

+1

Примечание: A будущий возможный вариант будет использовать ['await'] (https://github.com/tc39/ecmascript-asyncawait) с функциями, которые используют [ES6' Promise's] (https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Promise), при условии, что клиентский API MongoDB начнет их использовать. –

+0

Спасибо за примечание. Я проверю его. – Leo

ответ

2

Это один из самых востребованных вопросов в истории Интернета!

Поскольку узел является асинхронным, вам необходимо переписать функцию, чтобы вернуть обратный вызов или использовать что-то вроде обещаний.

Здесь с обратными вызовами:

var Get = function (criteria, cb) {  
    return Users.findOne(criteria,cb); 
}; 

А потом называют это нравится:

Get({}, function(err, res){ 
    console.log(res); 
}); 

Или вы можете использовать обещание, здесь он использует библиотеку Q

var Get = function (criteria) { 

var deferred = Q.defer(); 
Users.findOne(criteria,function(err, o){ 
     if (err) deferred.reject(err); 
      deferred.resolve(o); 
}); 
return deferred.promise; 
} 

Затем назовите это так:

Get({}).then(function(res){console.log(res)}); 

Обещанная версия кажется мне более сложной :).

+0

Есть ли что-нибудь еще, что я могу сделать? У меня было это, и мой код был очень грязным. – Leo

+0

Нет, узел является асинхронным, и это либо обещания, либо обратные вызовы на всем пути вниз :). Код на основе обратного вызова кажется мне элегантным :) –

+0

Это изящно, но в некоторой части мне нужно увидеть, есть ли ошибка или нет результата в каждой функции с базой данных, которую у меня есть. Но спасибо! Это решает мой вопрос. :) – Leo

Смежные вопросы