繁体   English   中英

bcrypt 错误:非法 arguments:字符串,未定义

[英]bcrypt Error: Illegal arguments: string, undefined

当我尝试使用 postman 发布 http://localhost:5000/user/login url 时出现这些错误

错误:非法 arguments:字符串,在 _async (C:\Users\Raghava\Desktop\react_vite\server\node_modules\bcryptjs\dist\bcrypt.js:286:46) 处未定义,位于 Z0D61F8370CAD1D412F80B84D143E12sktop\Deact_React_ server\node_modules\bcryptjs\dist\bcrypt.js:307:17 at new Promise () at Object.bcrypt.compare (C:\Users\Raghava\Desktop\cryptjs\server\bnode_modules: 306:20) 在 C:\Users\Raghava\Desktop\react_vite\server\router\UserRouter.js:106:34 在 processTicksAndRejections (internal/process/task_queues.js:93:5)

服务器.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}`);
});

用户路由器.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;

    

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

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM