Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJs-未定义回调-如何使用异步进行密码哈希?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 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

我是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上的异步相当陌生

这是我通过谷歌搜索()得出的结论,但我既不完全理解它,也无法让它发挥作用。一直说
引用错误:未定义回调

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的问题:请再看一遍评论,很清楚这显然不是这个问题的答案,以及为什么这个问题目前无法回答。