2015-04-17 81 views
1

我正在使用node.js和mongoose處理Restful API。我需要返回一個搜索結果的對象。這裏是我的代碼:返回貓鼬模型函數的結果

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),前提是MongoDB的客戶端API開始使用這些API。 –

+0

感謝您的注意。我會檢查它。 – Leo

回答

2

這是互聯網歷史上最常見的問題之一!

由於節點是異步的,所以你需要重寫函數來返回一個回調或者使用Promise之類的東西。

這是回調:

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