Node.js中createHash('sha1')正确用法及登录表单报错解决
解决登录表单的TypeError [ERR_INVALID_ARG_TYPE]错误
问题根源
报错核心原因是req.body.password为undefined,导致crypto.createHash().update()方法接收到无效参数。通常由两个原因导致:后端未正确解析请求体,或前端传递的参数名与后端不匹配。
解决方案步骤
第一步:配置请求体解析中间件
若使用Express框架,必须在路由处理前添加以下中间件,否则req.body会是空对象,无法获取前端传参:const express = require('express'); const app = express(); // 解析JSON格式请求体 app.use(express.json()); // 解析表单格式请求体(适配form-data或x-www-form-urlencoded提交方式) app.use(express.urlencoded({ extended: true }));第二步:核对前后端参数名一致性
检查前端请求的密码字段key是否为password,避免拼写错误。比如React提交请求的正确示例:fetch('/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: usernameValue, password: passwordValue // 此处key需与后端req.body.password严格对应 }) });第三步:添加参数校验拦截错误
在哈希处理前先判断参数是否存在,提前避免报错:const cryptoFile = require('crypto'); app.post('/login', (req, res) => { const { password } = req.body; if (!password) { return res.status(400).json({ error: '请输入密码' }); } // 正常执行哈希逻辑 let shasum = cryptoFile.createHash('sha1').update(password).digest('hex'); // 后续数据库校验逻辑... });
额外建议
SHA1算法安全性较低,推荐使用专门的密码哈希库bcrypt,它自带加盐和迭代处理,安全性更高:
const bcrypt = require('bcrypt'); // 存储密码时生成哈希 const hashPassword = await bcrypt.hash(password, 10); // 登录时校验密码 const isMatch = await bcrypt.compare(password, storedHash);
内容的提问来源于stack exchange,提问作者m.kreyn
相关产品推荐
相关产品推荐

