2017-02-16 15 views
0

私はユーザーとトークンのリストを持つmongodbデータベースを持っています。クエリを使用してfindOneにクエリを使用すると、その結果は未定義です。 findOneのためのコードは以下の通りである:私はfindOneのために印刷ノードjs Mongodb findOne not synchronous同期的に

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

ログ以下の通りです:

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にトークンとユーザーを保存しています。残りのapiごとにトークンが有効かどうかをチェックしています。 – ashwin1103

+0

まず、node.jsで同期ワードをユーザーに使用しないでください。サイトをリアルタイムで使用している1000人のユーザーがいるとします。この呼び出しを同期して実行するということは、1000人のユーザー全員がコードが実行されるまで待つ必要があるということです。これを非同期的に実行すると、残りの999ユーザーは引き続きアプリケーションを使用できます。 –

答えて

0

あなたができることは、同期コードをfindOneのコールバックの中に置くことです。例:

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

私の答えはあなたにとって有益でした。

1

あなたの最初のスニペットには何も結果を割り当てません。あなたのコード(簡略化):

+0

ありがとうございます。修正されました。しかし、それでも空のオブジェクトを返すのに対し、find()はlistを返します。 – ashwin1103

関連する問題