2017-02-16 3 views
0

У меня есть база данных mongodb со списком пользователей и токенов. Когда я использую запрос для findOne с запросом, его возврат не определен. Код для 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 я могу получить список пользователей, но только в журналов, он все равно возвращает неопределенный.

код находки:

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