2017-03-15 12 views
-1

私はNode.jsチュートリアルに従っています。私はデータがコールバック関数のパラメータに渡される方法について常に疑いを持っていました。例としてコールバック関数のパラメータ

User.addUser(newUser, (err, user) =>{ 
    if(err){ 
     res.json({success: false, msg:'Failed to register new user'}); 
    } else { 
     res.json({success: true, msg:'User registered'}); 
    } 
}); 

とアドユーザー機能は、私が渡され、どのように誤ると、ユーザーを理解していません

module.exports.addUser = function(newUser, callback){ 
    bcrypt.genSalt(10, (err,salt)=>{ 
     bcrypt.hash(newUser.password, salt, (err, hash) => { 
      if(err) throw err; 
      newUser.password = hash; 
      newUser.save(callback); 
     }); 
    }); 
} 

、と定義されます。誰かがこれを説明できますか?

+3

ここからは渡されません。それらは 'newUser.save'の中から渡されます。 'callback'をその関数に渡すだけで、おそらく最終的に呼び出すことになります。 – deceze

+0

ここでクイックルックを取る[クロージャの値をメインメソッドに返す](http://stackoverflow.com/a/42766223/2359679)、それはPHP用ですが、私は同じ論理だと思います – hassan

答えて

0

答えはnewUser.savecallbackというパラメータを受け取り、同じ種類のパラメータを渡します。コールバックをそのままセーブに渡すことができます。

User.prototype.save = function(callback) { 
    //do stuff to save the user 
    //maybe get an error in the process, or a user record, pass them to the callback 
    callback(saveError, userRecord) 
} 

saveaddUserの予想引数が同じであるため、コールバックストレートsaveに渡すことができます:私はuser.saveには、次のようになります想像してみてください。

編集: ただし、bcrypt呼び出しから返されたコールバックをエラーとともに呼び出すことをお勧めします。あなたはすでにエラーを返すコールバックを持っているので、スローするのはあまり意味がありません。呼び出し側はコールバックでエラーが発生すると予想しますので、代わりに次のように提案します:

bcrypt.hash(newUser.password, salt, (err, hash) => { 
     if(err) { 
      callback(err, null) 
      return 
     } 
     ... 
+0

これを取得していない部。 "saveとaddUserの期待される引数は同じなので、コールバックはそのままsaveに渡すことができます。" –

+0

user.saveメソッドとaddUserの両方が、 'err'が最初の引数で、' user'が2番目の引数であるコールバックが必要です。このため、addUserに渡されるコールバックは、両方とも同じコールバック引数を必要とするため、user.saveに直接渡すことができます。 –

関連する問題