2017-10-04 43 views
-1

我對nodeJS相當陌生,而且我的任務是創建一個樣本註冊頁面,並且使用它,我嘗試加密用戶的密碼。NodeJs - 回調未定義 - 如何使用異步密碼散列?

這就是我想出了,通過傳遞用戶的密碼使用:

function hashPassword(password) { 
    var salt = crypto.randomBytes(128).toString('base64') 
    var iterations = 1000; 
    var hash = crypto.pbkdf2Sync(password, salt, iterations, 512, 'sha512'); 
    return { 
    salt: salt, 
    hash: hash.toString('base64'), 
    iterations: iterations 
    }; 
} 

現在,我聽說這是使用異步的,可能需要一段時間功能的最佳實踐,但不幸的是我,而新的異步JS。

下面是我通過谷歌搜索(specifically, here)想出的,但我都不完全理解它,也不能讓它工作。口口聲聲ReferenceError: callback is not defined

function hashPassword(password, callback) { 
    var saltBytes = 128; 
    var iterations = 1000; 
    var hashBytes = 512 
    crypto.randomBytes(saltBytes, (err, salt) => { 
    if (err) { 
     return callback(err); 
    } 

    crypto.pbkdf2(password, salt, iterations, hashBytes, 'sha512', (err, hash) => { 
     if (err) { 
     return callback(err); 
     } 

     var combined = new Buffer(hash.length + salt.length + 8); 
     combined.writeUInt32BE(salt.length, 0, true); 
     combined.writeUInt32BE(iterations, 4, true); 

     salt.copy(combined, 8); 
     hash.copy(combined, salt.length + 8); 
     callback(null, combined); 
    }); 
    }); 
} 

據我有限的異步的知識去,這是在回調函數我應該做其他要求(在我的情況下,保存到DB)。

我做錯了什麼,或者我沒有得到什麼?

+0

嘛,你怎麼稱呼你的'hashPassword'功能,你有沒有傳遞迴調? – Bergi

+0

*「現在,我聽說最好的做法是在可能需要一段時間的函數上使用異步。」*只有當他們需要一段時間的原因是他們正在等待其他事情(如I/O事件)時。如果他們需要一段時間,因爲他們正在JavaScript代碼中工作,那麼使用「async」函數根本無濟於事。在你的情況下,** yes **,使用'pbkdf2'而不是'pbkdf2Sync'是最好的做法,因爲'crypto'減輕了JavaScript線程的負擔。 –

+0

*「一直說'ReferenceError:回調沒有定義'」*它明確**是**在你正在使用的代碼中定義。請用[mcve]更新您的問題以證明問題。 –

回答

-1

你是否打電話給你的功能?

hashPassword('password here', function (error, combined) { 
    if(error) { 
    // handle error 
    } else { 
    // do something with combined 
    } 
}); 

我認爲錯誤是因爲你不發送回調函數的第二個參數,當你調用hashPassword功能

Check this gist

+0

這將導致不同的錯誤消息(具體來說:「TypeError:回調不是函數」)。引用的錯誤消息只會因嘗試使用標識符「callback」而未定義它而引起。但它在提供的代碼中定義,因此目前該問題無法得到解答。 –

+0

@TJCrowder我剛剛測試了它 [鏈接](https://gist.github.com/andritogv/816a09b48c21ba1fe92f48c5566c7c05) 和在控制檯中的結果是 <緩衝區00 00 00 80 00 00 03 e8 77 5f 30 5f d3 2b 70 84 16 de f6 56 77 7c 33 c8 e9 3d bd 56 a1 2c 1a b9 db 6e 35 0b ad e6 c4 72 94 57 cd c7 87 fa f0 d3 a8 bd ...> 我認爲我不應該得到你的downvote ... –

+0

你不知道是誰downvoted;你只知道誰評論。他們通常不是同一個人。無論如何,對選票的評論總是無用的。 –