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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:09:59