Node.js的POST请求中Array.find匹配用户数组返回undefined如何解决
问题原因及解决方案
为什么控制台能运行,POST请求中返回undefined
你在控制台测试时传入的password是数字类型,和数组内存储的number类型1234类型一致,严格相等===判断生效;但表单提交的所有字段默认都是字符串类型,req.body.password拿到的是字符串"1234",和数字1234用===判断会直接返回false,最终find返回undefined。除此之外还有以下可能的诱因:
- 未配置Express请求体解析中间件,
req.body为空对象,email和password均为undefined,无法匹配到用户 - 输入的邮箱存在大小写差异,比如你输入的是
Sherry@gmail.com,和数组内的sherry@gmail.com不匹配
修复步骤
- 先配置请求体解析中间件,确保能正常拿到表单提交的参数
在你的Express路由定义前添加以下代码:
// 解析JSON格式请求体 app.use(express.json()) // 解析form表单提交的urlencoded格式请求体 app.use(express.urlencoded({ extended: true }))
- 修正类型匹配逻辑
两种可选方案,推荐统一使用字符串类型存储密码,符合实际业务场景:
// 方案1:匹配时将传入的密码转为数字 let user1 = users.find((user) => user.email === email && user.password === Number(password)); // 方案2:修改模拟数组的密码为字符串类型(更推荐) const users = [ { id: 1, name: 'Sherry', email:'sherry@gmail.com', password: '1234' }, { id: 2, name: 'harry', email:'harry@gmail.com', password: '1234' }, { id: 3, name: 'cherry', email:'cherry@gmail.com', password: '1234' } ]
- 修正后续代码笔误
你当前if判断中使用了未定义的user变量,需要替换为实际定义的user1:
if(user1) { req.session.userId = user1.id return res.redirect('/home') }
内容的提问来源于stack exchange,提问作者Sherry Jain
相关产品推荐
相关产品推荐

