2016-05-22 14 views
0

私は私のエクスプレスアプリのすべての部分から呼び出すことができるメソッドを作成しようとしています、私は単にこのメソッドに値を渡し、moongoseを使ってmongodbを検索して、結果としてブール値。ノードjsコールバックはvar

function findUserExists(name){ 

User.findOne({ "name": name }, function(err, user) { 

if (user){ 
    console.log("user exits"); 
    return true; 
} 
else{ 
     console.log("user not exits"); 
    return false; } 
}); 

私はこれをこのような別の方法で呼び出すと、時間内にブール値を返しません。

if (findUserExists("username")){ 

// redirect to dashboard 
console.log("user exits"); 
    res.redirect('/dashboard'); 
} 
else { 
// redirect to sign up page 
console.log("user must sign up"); 
    res.redirect('/signup'); 
} 

だから他の機能はfindUserExists()からブール値を取得する前に実行し、この場合には、私の質問は私が呼び出すことができる方法で、他の関数を実行する前に、この関数は値を返すことができます方法ですそれはIFの状態またはこのようなvarでもあります

var exists = findUserExists(name); 
+1

ことができれば文のネスト "その他の機能"? ( // を呼び出す関数) – Sulot

+1

@Sulotこれは、ユーザが存在しているかどうかを知ってから、ダッシュボードページにリダイレクトして、登録するようにリダイレクトしていない場合にのみ行うことができます私の質問を更新しました –

+0

[非同期呼び出しからの応答を返すにはどうしたらいいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from- an-asynchronous-call) – JJJ

答えて

4

非同期機能で同期コードを強制しようとしています。 短い答えは:あなたはこの

function findUserExists(name, callback) { 
    User.findOne({ "name": name }, function (err, user) { 
     callback(user); 
    }); 
} 

をコールバックしてから、このように使用するあなたの関数に変換すべきではない。

findUserExists("username", function (exists) { 
    if (exists) { 
     console.log("user exits"); 
     res.redirect('/dashboard'); 
    } else { 
     console.log("user must sign up"); 
     res.redirect('/signup'); 
    } 
}); 

あなたがコードに約束を使用することができますノード4以上を使用すると、より同期的に見えます。

1

これは、findUserExists関数が非同期を呼び出しているが、これを同期的に使用しようとしているためです。

あなたが探していることを達成するには、関数にコールバック関数を提供するか、約束を返す必要があります。最も簡単な方法は、あなたがすでにマングースにコールバックを使用しているので、このようになります:あなたのロジックで

function findUserExists(name , callback){ 
    User.findOne({ "name": name }, function(err, user) { 
     if(err) callback(err); 
     else if (user){ 
     console.log("user exits"); 
     callback(null, true); 
     } 
     else{ 
     console.log("user does not exist"); 
     callback(null, false); 
     } 
    }); 

    findUserExists("username", function(err, user){ 
     if(err) console.log(err); 
     else if(user){ 
     console.log("user exits"); 
     res.redirect('/dashboard'); 
     // redirect to dashboard 
     } 
     else { 
     // redirect to sign up page 
     console.log("user must sign up"); 
     res.redirect('/signup'); 
     } 
    } 
2

は問題がある、あなたはDBサーバのようなクエリ自体に発生する可能性があります処理していないエラーがありますダウン。

何のコールバックマングースに渡されていない場合、それは約束を返します..など、のawait非同期、約束を使用して

をコールバックを可能な限りと約束への切り替えを使用して避けてください。クエリが成功したの場合、を文書で解決します。この場合、ユーザが存在しない場合はとなり、のヌルlink)と解決されます。存在する場合は、そのドキュメントで解決されます。 クエリでが失敗した場合、例えばDBサーバーが使用できないなどの場合、約束はであり、エラーオブジェクトのあるは拒否されます。

DBコール

function findUserExists(name){ 
    return User.findOne({ "name": name }) 
    .then(function(doc){//This function will be executed if DB query was successful. 
     //You can write additional logic if any to handle the returned doc here 
     return doc; 
    }, function(err){// This function will be executed if something goes wrong with db server or query. 
     //You can write logic for error handling in DB connection like logging DB failure. 
     return err; 
    }) 
    } 

検証:

findUserExists(name) 
.then(function(user){//Resolved callback: This function is executed if previous promise was resolved 
    if(!user){ //If user does not exist null will be returned 
    console.log('User must sign up'); 
    return res.redirect('/signup'); 
    } 
    console.log('User Exists'); 
    return res.redirect('/dashboard'); 
},function(err){ //This function is executed if previous promise is rejected 
    console.log('Some error occurred in DB query'); 
}) 
+1

かなり深く説明。あなたは、実際のアプリケーションで重要な約束事とエラー処理をカバーしています。 Ceddyの質問では、エラー処理については言及していませんでした。アプリケーションから問題を抽出し、すべての可能なトピックをカバーしない方がよい場合もあります。 – Everettss

関連する問題