You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Node.js登录功能中的‘Error: data and hash arguments required’错误

Node.js + MongoDB登录功能报错求助:data and hash arguments required

各位开发者好,我是后端新手,用Node.js和MongoDB做带注册、登录的项目,现在登录流程出问题了,求帮忙看看。

服务器代码

const express = require("express")
const {default:mongoose} = require("mongoose")
const app = express();
const Blog = require("./models/blog.js")
const User = require("./models/User.js")
const bcrypt = require("bcrypt")
const JWT = require("jsonwebtoken")
const cookies = require("cookie-parser")
const cookieJwtAuth = require("./cookieAuth.js")

app.set("views engine", "ejs")
mongoose.connect("mongodb://127.0.0.1:27017/fitnesblog").
then(()=>{console.log("Mongoose server has Started")
})
.catch(()=>{
    console.log("Unsuccessful")
})

app.use(express.static("public"))
app.use(express.urlencoded())
app.use(cookies())

app.post("/blogs/login",async(req,res)=>{
    const {Email,Password} = req.body;

    const user = await User.findOne({Email})

    const isMatch = await bcrypt.compare(Password, user.Password);

    if (!isMatch){
        return res.redirect("/blogs/signup")
    }

    const payload = {
        User: {
            Email:User.Email,
        },
    }

    const token = await JWT.sign(payload,"thisismysecretkey",{
        expiresIn:"3600",
    })

    res.cookie("token",token,{
        httpOnly: true,
    })

    res.redirect("/blogs/create")


})

})
app.listen(5000,()=>{
    console.log("server currently running on port 5000")
})

报错信息

C:\Users\go\Desktop\ejs\node_modules\bcrypt\bcrypt.js:208
        error = new Error('data and hash arguments required');
                ^

Error: data and hash arguments required
    at Object.compare (C:\Users\go\Desktop\ejs\node_modules\bcrypt\bcrypt.js:208:17)
    at C:\Users\go\Desktop\ejs\node_modules\bcrypt\promises.js:29:12
    at new Promise (<anonymous>)
    at Object.module.exports.promise (C:\Users\go\Desktop\ejs\node_modules\bcrypt\promises.js:20:12)
    at Object.compare (C:\Users\go\Desktop\ejs\node_modules\bcrypt\bcrypt.js:204:25)
    at C:\Users\go\Desktop\ejs\app.js:130:34
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
[nodemon] app crashed - waiting for file changes before starting...

问题分析与修复方案

这个报错是因为bcrypt.compare()的两个参数(明文密码和哈希密码)有一个为空,主要原因和修复步骤如下:

  1. 补全输入校验
    前端可能没传对邮箱/密码,或者表单name属性和后端解构的Email/Password不匹配,导致req.body拿不到值。先加校验:
app.post("/blogs/login",async(req,res)=>{
    const {Email,Password} = req.body;
    // 先校验输入是否完整
    if (!Email || !Password) {
        return res.redirect("/blogs/login?error=请填写完整的邮箱和密码");
    }
    // ...后续代码
})
  1. 处理用户不存在的情况
    如果根据邮箱没查到用户,user会是null,此时user.Password为undefined,传给bcrypt.compare就会报错。必须先判断用户是否存在:
const user = await User.findOne({Email});
if (!user) {
    return res.redirect("/blogs/signup?error=该邮箱未注册,请先注册");
}
// 再执行密码比对
const isMatch = await bcrypt.compare(Password, user.Password);
  1. 修正JWT Payload错误
    代码里payload中的Email:User.Email写错了,User是模型类,应该用查询到的实例user.Email:
const payload = {
    User: {
        Email: user.Email, // 改成小写的user
    },
}
  1. 修复语法错误
    代码最后多了一个}),直接删掉,否则会导致脚本语法错误。

内容的提问来源于stack exchange,提问作者Francis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 08:39:50