2017-03-15 135 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'}); 
    } 
}); 

和ADDUSER函数定义为,

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.save也需要callback参数并将其传递给相同类型的参数。所以你可以直接将回调传递给保存。我想象user.save看起来像下面这样:

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预期ARG游戏一样,回调可以通过直入save

编辑: 但是,如果从bcrypt调用中返回一个错误,我会建议调用您的回调。既然你已经有了一个回调来给出错误,抛出并不合理。呼叫者会预期在回调中出现错误,所以我建议用这种方式代替:

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

没有得到这个部分。 “因为保存和addUser的预期参数是相同的,所以回调可以直接传入保存。” –

+0

user.save方法和addUser都需要一个回调函数,其中'err'是第一个参数,'user'是第二个参数。正因为如此,传递给addUser的回调函数可以直接传递给user.save,因为两者都需要相同的回调参数。 –