如何修复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()的两个参数(明文密码和哈希密码)有一个为空,主要原因和修复步骤如下:
- 补全输入校验
前端可能没传对邮箱/密码,或者表单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=请填写完整的邮箱和密码"); } // ...后续代码 })
- 处理用户不存在的情况
如果根据邮箱没查到用户,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);
- 修正JWT Payload错误
代码里payload中的Email:User.Email写错了,User是模型类,应该用查询到的实例user.Email:
const payload = { User: { Email: user.Email, // 改成小写的user }, }
- 修复语法错误
代码最后多了一个}),直接删掉,否则会导致脚本语法错误。
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

