【问题标题】:Error: data and salt arguments required (node js, bcrypt)错误:需要数据和盐参数(节点 js、bcrypt)
【发布时间】:2020-12-13 09:18:04
【问题描述】:

我收到“需要数据和盐参数”错误。使用 postgresql 的 Express/node js 应用程序。

编辑:我认为我的问题是从客户端正确传递“密码”,因为当我 console.log(password) 它返回 undefined + 上面提到的错误。我不知道如何解决这个问题。

任何帮助或建议将不胜感激。

这是我的 jwtAuth 代码:

const express = require("express");
const router = require("express").Router();
const bcrypt = require("bcrypt");
const pool = require("../../../db");

router.post("/register", async (req, res) => {

    try { // 
        const {email, password, name1, name2} = req.body;

        const user = await pool.query("SELECT * FROM userr WHERE email = $1", [email]);

        if (user.rows.length !== 0) {
            return res.status(401).send("user already exists"); // this works
        }

      // trouble begins here
        //const saltRound = 10;
        var salt =  await bcrypt.genSalt(10);
        var bcryptPassword =  bcrypt.hashSync(password, salt);

        const newUser = await pool.query("INSERT INTO userr (lastName, firstName, email, passwrd) VALUES ($1, $2, $3, $4) RETURNING *", [name1, name2 , email, bcryptPassword]);
        res.json(newUser.rows[0]);

        // 5. generating jwt token

    } catch (err) {
        console.error(err.message);
        res.status(500).send("server error");
    }
});

module.exports = router;

【问题讨论】:

  • req.body 为空,因此 bcrypt 无法散列和加盐未定义。

标签: node.js postgresql express authentication bcrypt


【解决方案1】:

你可以使用自动生成盐的函数版本,只需传递saltRounds:

const express = require("express");
const router = require("express").Router();
const bcrypt = require("bcrypt");
const pool = require("../../../db");

router.post("/register", async (req, res) => {
    try {
        const { email, password, name1, name2 } = req.body;

        const user = await pool.query("SELECT * FROM userr WHERE email = $1", [email]);

        if (user.rows.length !== 0) {
            return res.status(401).send("user already exists"); // this works
        }

        const bcryptPassword = await bcrypt.hash(password, 10);
        const newUser = await pool.query(
            "INSERT INTO userr (lastName, firstName, email, passwrd) VALUES ($1, $2, $3, $4) RETURNING *",
            [name1, name2, email, bcryptPassword]
        );

        res.json(newUser.rows[0]);
    } catch (err) {
        console.error(err.message);
        res.status(500).send("server error");
    }
});

module.exports = router;

如果您担心应用程序的性能,则不应使用.hashSync,因为同步操作会阻塞线程;相反,最好将.hash 与await 一起使用。

【讨论】:

  • 感谢您的帮助。但是,我已将代码调整为您提供的代码,但我仍然面临同样的错误
  • 所以问题不在代码上,而是在获取密码参数时,请确保您正确发送和接收来自客户端的密码参数。你可以用console.log(password); 输出它,看看它输出了什么。
  • 所以当我 console.log(password) 出来时它是未定义的。这意味着客户输入的密码没有被正确存储(我认为)。我正在使用邮递员进行测试。如何正确存储客户端密码?我很抱歉问了这么多问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
相关资源
最近更新 更多