【问题标题】:bcrypt Error: Illegal arguments: string, undefinedbcrypt 错误:非法参数:字符串,未定义
【发布时间】:2021-08-21 08:08:55
【问题描述】:

当我尝试使用邮递员发布 http://localhost:5000/user/login 网址时出现这些错误

错误:非法参数:字符串,未定义 在 _async (C:\Users\Raghava\Desktop\react_vite\server\node_modules\bcryptjs\dist\bcrypt.js:286:46) 在 C:\Users\Raghava\Desktop\react_vite\server\node_modules\bcryptjs\dist\bcrypt.js:307:17 在新的承诺 () 在 Object.bcrypt.compare (C:\Users\Raghava\Desktop\react_vite\server\node_modules\bcryptjs\dist\bcrypt.js:306:20) 在 C:\Users\Raghava\Desktop\react_vite\server\router\用户路由器.js:106:34 在 processTicksAndRejections (internal/process/task_queues.js:93:5)

server.js

const express = require("express");
const cors = require("cors");
const dotenv = require("dotenv");
const mongoose = require("mongoose");

const authroute = require("./router/UserRouter");

//config the express
const app = express();

//config the cors
app.use(cors());

//config the body-parser
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

//config the .env
dotenv.config({ path: "./config/config.env" });

//port
const port = 5000;

//connect to database
mongoose
  .connect(process.env.MONGO_DB_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() => console.log("connected to database successfully..."))
  .catch((err) => console.log(err));

//config the routes
app.use("/user", authroute);

//starting the server
app.listen(port, () => {
  console.log(`server is started at posrt ${port}`);
});

userRouter.js

const express = require("express");
const Router = express.Router();
const User = require("../models/User");
const bcrypt = require("bcryptjs");
const gravatar = require("gravatar");
const jwt = require("jsonwebtoken");
const { check, validationResult } = require("express-validator/check");


Router.post(
  "/register",
  [
    check("name").notEmpty().withMessage("name is required"),
    check("email").isEmail().withMessage("proper email is required"),
    check("password")
      .isLength({ min: 6 })
      .withMessage("min 6 chars for password"),
  ],
  async (req, res) => {
    let errors = validationResult(req);
    //if error containes
    if (!errors.isEmpty()) {
      return res.status(400).json({
        errors: errors.array(),
      });
    }
    try {
      let { name, email, password } = req.body;
      //user exist
      let user = await User.findOne({ email });
      if (user) {
        return res.status(400).json({
          errors: [{ msg: "user alredy exist" }],
        });
      }
      //encrypt the password
      let salt = await bcrypt.genSalt(10);
      password = await bcrypt.hash(password, salt);
      //get the avatar
      let avatar = gravatar.url(email, {
        s: "200",
        r: "pg",
      });
      //store the user
      user = new User({ name, email, password, avatar });
      await user.save();
      //json web token
      let payload = {
        user: {
          id: user.id,
        },
      };
      jwt.sign(payload, process.env.JWT_SECRET_KEY, (err, token) => {
        if (err) {
          throw err;
        }
        res.status(200).json({
          result: "success",
          token: token,
        });
      });
    } catch (error) {
      console.error(error);
      res.status(500).json({
        errors: [{ msg: error.message }],
      });
    }
  }
);

Router.post(
  "/login",
  [
    check("email").isEmail().withMessage("proper email is required"),
    check("password").notEmpty().withMessage("password is required"),
  ],
  async (req, res) => {
    let errors = validationResult(req);
    //if error containes
    if (!errors.isEmpty()) {
      return res.status(400).json({
        errors: errors.array(),
      });
    }
    try {
      let { email, password } = req.body;
      //check for email
      let user = await User.findOne({ email });
      if (!user) {
        return res.status(400).json({ errors: [{ msg: "invalid credentials" }] });
      }

      //compare password
      let isMatch = await bcrypt.compare(password, user.password);
      if (!isMatch) {
        return res.status(400).json({ errors: [{ msg: "invalid credentials" }] });
      }
      //json web token
      let payload = {
        user: {
          id: user.id,
        },
      };
      jwt.sign(payload, process.env.JWT_SECRET_KEY, (err, token) => {
        if (err) {
          throw err;
        }
        res.status(200).json({
          result: "success",
          token: token,
        });
      });
    } catch (error) {
      console.error(error);
      res.status(500).json({
        errors: [{ msg: error.message }],
      });
    }
  }
);

module.exports = Router;

    

【问题讨论】:

  • 尝试在res.status(400).json({ errors: [{ msg: "invalid credentials" }] }); 之前添加return 关键字这可能会解决它,因为即使在您发回响应后它可能会继续存在。这也解决了 express 的另一个问题,我不会解释。
  • 另外,请添加评论以指出错误所在,以便用户可以更快地帮助您。
  • 我遇到了同样的错误。由于我使用elasticsearch作为数据库并且我处于使用该数据库的早期阶段,因此我的(查找用户)查询返回了一个包含许多元素的json对象,其中一个是用户对象。所以我的 user.password 是未定义的。我不确定您的问题是否相同,但尝试在控制台中记录 User.findOne() 结果以检查 user.password 是否正确引用。我确定您的问题应该很早就被出售了,但我正在分享评论,以便它可以帮助其他人......

标签: node.js node-modules


【解决方案1】:

这很可能是抛出和错误,因为您的代码在您检查用户是否存在后没有返回:

let user = await User.findOne({ email });
if (!user) {
   res.status(400).json({ errors: [{ msg: "invalid credentials" }] });
   // most likely still runs code after this because it is not returning.
}

请在res.status(400).json({ errors: [{ msg: "invalid credentials" }] })之前添加return关键字。

最终代码:

if (!user) {
   return res.status(400).json({ errors: [{ msg: "invalid credentials" }] });
}

此外,我在出现错误之前查看了您的代码。你做await bcrypt.genSalt(10)await bcrypt.hash(password, salt)。如果您查看文档,您需要为async 版本传递一个回调。如果您想使用sync 版本而不使用回调,请使用bcrypt.genSaltSync()bcrypt.hashSync()

【讨论】:

  • 您最后的评论不正确:您可以await genSalt,因为如果您不传递回调,它会返回一个承诺。 github.com/kelektiv/node.bcrypt.js#with-promises
  • 不要只使用此处的同步方法。 bcrypt 很慢,这将对任何实际负载下的性能产生负面影响。
  • @Joe 抱歉,忘了这是bcryptjs
  • @hexerous 在 res.status(400).json({ errors: [{ msg: "invalid credentials" }] }) 之前添加了 return 关键字。但我仍然遇到同样的错误
  • @B.RAGHAVA 你能在UserRouter.js分享第106行吗
猜你喜欢
  • 2022-12-17
  • 2021-07-21
  • 1970-01-01
  • 2020-08-13
  • 2021-04-20
  • 2019-03-29
  • 2018-06-22
  • 2019-06-01
  • 2021-05-17
相关资源
最近更新 更多