2017-12-04 18 views
0

私はmongodbが新しく、クエリ後にローカル変数を更新する際に問題があります。私はノードjsを使用していると私は私のクエリ結果に応じて更新しようとしているローカル変数を持っているが、それは私の関数がクエリの前に返すようだ。私はノードjsが非同期だが、私はそれに対処するのに問題があることを理解しています。私も、私は、クエリ結果から特定の値を抽出しようとしているが、異なる無関係な問題を抱えているノードjsとmongodb非同期の問題

function userExist(userList, username){ 
 
    //var usert = new UserSchema() 
 
    var exist = false 
 
    UserSchema.findOne({userName: username}, function (err, usert) { 
 
     if (err) return handleError(err); 
 
     if (usert) { 
 
     // doc may be null if no document matched 
 
     exist = true 
 
     } 
 
    }) 
 
    console.log("boolean " + bool) 
 
    return exist 
 
    \t // return username in userList 
 
    // return query 
 
}

:あなたは以下の私のコードを見ることができます。私のスキーマは以下の通りです:

//import dependency 
 
var mongoose = require('mongoose') 
 
var Schema = mongoose.Schema 
 
//create new instance of the mongoose.schema. the schema takes an 
 
//object that shows the shape of your database entries. 
 
var UserSchema = new Schema({ 
 
userName: String, 
 
userID: String, 
 
Conversations: [ 
 
    { 
 
    conversationID: String, 
 
    messages: [ 
 
     { 
 
     message: String, 
 
     messageID: String, 
 
     sender: String, 
 
     time: String 
 
     } 
 
    ] 
 
    } 
 
] 
 
}) 
 
//export our module to use in server.js 
 
module.exports = mongoose.model('User', UserSchema)

私は、会話の配列の値を取得し、それを新しい会話を追加し、それをデータベースにプッシュバックしようとしています。

いずれかの質問に対する回答が本当に有益であり、高く評価されます。私はuserExist機能を使用していますどこ

ちょうど明確化のために、これは次のとおりです。

//Verify Username 
 
\t socket.on(VERIFY_USER, (nickname, callback)=>{ 
 
\t \t if(userExist(connectedUsers, nickname)){ 
 
     console.log("user exist") 
 
\t \t \t callback({ userExist:true, user:null }) 
 
\t \t }else{ 
 
     console.log("user does not exist") 
 
\t \t \t callback({ userExist:false, user:createUser({name:nickname, socketId:socket.id})}) 
 
\t \t } 
 
\t })

+0

'findOne'は非同期なので、' userExist'は約束を返す必要があります。 –

答えて

0

をすでにfindOneは約束を返し指摘。

あなたが成功したコールバックを実行する約束を扱うか、コールバックfindOne機能体内のその後

function success(user){ 
    //no error check 
    //doc has been found 
    //do something 
    } ; 
function fail(err){ 
    console. log(err) 
    } 

として渡すために2つの関数を定義しfindOne結果

で失敗する可能性があります

if (err) return fail(err) ; 
//else 
return success(user) 

OR

あなたはuserExist funcをラップすることができますン本体は約束に

function userExist(userList, username){ 
    return new Promise(function(resolve, reject){ 
    var exist = false 
    UserSchema.findOne({userName: username}, function (err, usert) { 
     if (err) return reject(err); 
     if (usert) { 
     // doc may be null if no document matched 
     exist = true 
     resolve(exist) 
     } 
    }) 
}) 
} 

を返すためにそして、あなたはuserExistを呼び出すとき

userExist(userList, username).then(function(user){ 
     //do something with the user 
    }).catch(function(reason) { 
     console.error(reason); 
    }); 
+0

これは実際には望む効果がありません。私は、ifステートメントでuserexist関数を呼び出し、呼び出すたびにifステートメントを実行した後に戻ります。もしあなたが何か他のことをするならば、 –

+0

findOneは非同期で、約束やコールバックでそれを処理しなければならない、私は別のものを追加した、それが助けてくれることを願っている –

+0

if文の解決を動かしてください。すべてが今働いています。 –

関連する問題