Javascript NodeJs-未定义回调-如何使用异步进行密码哈希?
我是nodeJS的新手,我的任务是创建一个示例注册页面,并用它尝试加密用户的密码 下面是我的想法,通过简单地传递用户密码即可使用:Javascript NodeJs-未定义回调-如何使用异步进行密码哈希?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我是nodeJS的新手,我的任务是创建一个示例注册页面,并用它尝试加密用户的密码 下面是我的想法,通过简单地传递用户密码即可使用: function hashPassword(password) { var salt = crypto.randomBytes(128).toString('base64') var iterations = 1000; var hash = crypto.pbkdf2Sync(password, salt, iterations, 512, 'sha5
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上的异步相当陌生
这是我通过谷歌搜索()得出的结论,但我既不完全理解它,也无法让它发挥作用。一直说引用错误:未定义回调
:
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)
我做错了什么,或者我没有得到什么?您是这样调用函数的吗
hashPassword('password here', function (error, combined) {
if(error) {
// handle error
} else {
// do something with combined
}
});
我认为错误是因为调用hashPassword函数时没有将回调函数作为第二个参数发送
那么,您是如何调用您的
hashPassword
函数的,您传入了回调吗?“现在,我听说,对可能需要一段时间的函数使用异步是最佳做法”,前提是它们需要一段时间的原因是它们正在等待其他东西(如I/O事件)。如果因为在JavaScript代码中工作而需要一段时间,那么使函数async
毫无帮助。在您的情况下,是的,使用pbkdf2
而不是pbkdf2Sync
将是最佳实践,因为crypto
可以减轻JavaScript线程的负担。“一直说ReferenceError:callback未定义
”,它显然是在您使用的代码中定义的。请用一个演示问题的示例更新您的问题。这将导致不同的错误消息(特别是:TypeError:callback不是函数
)。引用的错误消息只有在尝试使用标识符回调
而未对其进行定义时才会出现。但它是在给出的代码中定义的,所以现在这个问题无法回答。@T.J.Crowder我刚刚测试了它,结果在控制台上是我认为我不值得你投反对票……你不知道谁投了反对票;你只知道是谁评论的。他们往往不是同一个人。无论如何,关于投票的评论总是没有用的。关于OP的问题:请再看一遍评论,很清楚这显然不是这个问题的答案,以及为什么这个问题目前无法回答。