2017-02-16 198 views
0

我有一個mongodb數據庫,包含用戶和令牌列表。當我使用查詢findOne查詢時,它的返回值是undefined。對於findOne的代碼如下:節點js Mongodb findOne不工作同步

var getApiTokenForUser = function(user){ 
console.log('get api token for :'+user); 
var collection = db.collection(user_token_collection_name); 
var result; 
if(collection){ 
    console.log("cursor query: "+user); 
    var cursor = collection.findOne({'user':user}); 
    console.log("cursor result: "+JSON.stringify(cursor)); 
} 
return result;} 

日誌,我打印的findOne是如下:

get api token for :Zeus 
cursor query: Zeus 
cursor result: {} 
getApiTokenForUser return: undefined 

但是,如果我用發現的,而不是findOne我可以得到用戶的名單,但只有在日誌,它仍然返回undefined。爲查找

代碼:

var getApiTokenForUser = function(user){ 
console.log('get api token for :'+user); 
var collection = db.collection(user_token_collection_name); 
var result; 
if(collection){ 
    console.log("cursor query: "+user); 
    var cursor = collection.find({'user':user}); 
    cursor.forEach(function(data) { 
     result = data; 
     console.log("cursor result: "+JSON.stringify(data)); 
    }); 
} 
return result;} 

和日誌:

cursor query: Zeus 
getApiTokenForUser return: undefined 
saveUserApiToken 
cursor result: {"_id":"58a56442545e812a68f87bbe","user":"Zeus","token":"eyJhbGci 
OiJIUzI1NiJ9.WmV1cw.mAQh65o-d2tOp_Fchi7iPm5pu_2f4QSXOAQ5JtoEe10"} 

我想findOne同步工作。有什麼辦法嗎?

+0

您能告訴我們getApiTokenForUser函數被調用的上下文嗎?在Node.js中,你不能讓'findOne'以同步方式工作,但是你可以使用'Promises'來做到這一點。 – chridam

+0

我正在使用它來驗證用戶。當用戶登錄時,我將令牌和用戶保存在mongodb中,並且每次休息apis時,我正在使用該令牌檢查是否有效。 – ashwin1103

+0

首先不要用node.js用戶同步字。想象一下你有1000個用戶正在實時使用你的網站的情況。事實上,您同時呼叫所有1000個用戶需要等待代碼執行完畢...以這種方式異步執行,其餘999個用戶可以繼續使用您的應用程序。 –

回答

0

你可以做的是把同步代碼放在findOne的回調中。例如:

collection.findOne({'user':user}, function(error,user) {  
    //Synchornous code here 
}) 

希望我的回答對你有幫助。

1

您從不將結果賦給第一段代碼中的任何內容。您的代碼(簡體):

var result; // you never assign anything to it 
return result; // undefined 
+0

謝謝。糾正。但仍然返回空對象,而find()返回列表。 – ashwin1103