数据必须是一个字符串,盐必须是一个盐字符串或轮数。

3
这是我得到的错误: 错误:数据必须是字符串,盐必须是一个salt字符串或一定数量的回合数。 我编写的代码是使用他们的电子邮件id在我的数据库中重置密码。 如果这不正确,有人可以告诉我如何在Node.js中使用Oracle数据库重置密码吗? 错误在bcrypt.hash行。
下面是完整代码:
function changePassword(email, newPassword, callback) {

    var oracledb = require('oracledb');
    oracledb.outFormat = oracledb.OBJECT;

    oracledb.getConnection({
        user          : '',
        password      : '',
        connectString : ''
      },
      function(err, connection) {
        if (err) {
          return callback(new Error(err));
        }
        bcrypt.hash(newPassword, numSaltRounds, function(err, hash) {
          if (err) { return callback(err); }
          connection.execute(
            ' select password as "password" = : hash, ' +
            ' from jsao_users ' +
            ' where email = :email ', [hash, email], { autoCommit: true },
            function(err, result) {
              if (err) {
                console.log(err);
                doRelease(connection);
                return callback(new Error(err));
              }
              doRelease(connection);
              callback(null, result.rowsAffected > 0);
            });
        });

        // Note: connections should always be released when not needed
        function doRelease(connection) {
          connection.close(
            function(err) {
              if (err) {
                console.error(err.message);
              }
            });
        }
      });
}

最初的回答:这是我遇到错误的部分: 翻译内容:

这是我遇到错误的部分:

 bcrypt.hash(newPassword, numSaltRounds, function(err, hash) { //this is the line
          if (err) { return callback(err); }
          connection.execute(
            ' select password as "password" = : hash, ' +
            ' from jsao_users ' +
            ' where email = :email ', [hash, email], { autoCommit: true },
            function(err, result) {
              if (err) {
                console.log(err);
                doRelease(connection);
                return callback(new Error(err));
              }
              doRelease(connection);
              callback(null, result.rowsAffected > 0);
            });
        });

numSaltRounds 的值是多少? - Dan McGhan
最好先检查newPassword和numSaltRound是否为假值。 - Aljohn Yamaro
7个回答

3
当您将 newPassword 作为数字传递时,会发生此错误。因此,最好将 newPassword 作为字符串传递,或者您可以将 newPassword 转换为字符串,例如 newPassword.toString()
示例。
  let newPassword = newPassword.toString();

  bcrypt.hash(newPassword, numSaltRounds, function(err, hash) {});

2

我也遇到了这个错误。我尝试了以下方法。

我们发送的值是整数,因此会抛出错误: { "email": "vignesh@gmail.com", "password": 1234 // 这是整数 }


所以,我将整数修改为字符串,然后错误消失了: { "email": "vignesh@gmail.com", "password": "1234" // 这是字符串 }

结论:期望的是字符串值。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

1

我在我的用户模型中将密码设置为数字类型。哈希函数的第一个参数应该是字符串。将类型设置为字符串有所帮助。


1

你可能正在发送密码数字

{
  "email": "yourEmail@mail.com",
  "fullName": "Fullname",
  "password": "123456" // make sure it is a string
}

0
请在加密之前将您的明文或req密码转换为字符串。
plaintext = req.body.password.toString();
const hashPassword = await bcrypt.hash(plaintext, salt);

0

我也遇到了同样的错误,问题在于我在模型定义中将密码类型设置为数字,因此brcypt返回了错误。当我将其更改为字符串类型时,它正常工作。

我正在使用Mongo db Atlas。


0

当您设置密码并对其进行哈希处理时,请保持一致。如果使用bcrypt/bcrypt.js,则可以选择使用不带async/await关键字的hashSync或使用带有async/await关键字的哈希。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接