Express.js报TypeError:无法读取undefined的strEmail属性如何解决
问题根因
报错触发的直接原因是req.body为undefined,尝试从undefined上读取strEmail属性就会抛出该类型错误。Express 默认不会自动解析 POST 请求的请求体,即使是高版本,也需要手动挂载对应解析中间件,才能把 Postman 传递的 JSON 格式请求体解析后挂载到req.body属性上。
另外原有登录判断逻辑存在语法bug,会导致邮箱校验完全失效。
排查解决步骤
- 第一步:挂载JSON请求体解析中间件
确保在定义/login路由之前,添加如下中间件配置,用来解析application/json格式的请求体:const express = require('express') const app = express() // 注意:中间件必须写在路由注册之前,否则不会生效 app.use(express.json()) // 如果需要解析x-www-form-urlencoded格式的表单请求,可以额外加这行 app.use(express.urlencoded({ extended: true }))如果你使用的是Express 4.16.0以下的版本,需要先安装
body-parser依赖,将上述中间件替换为app.use(require('body-parser').json())即可,高版本不需要额外安装依赖。 - 第二步:检查Postman请求配置
发送请求时,在raw格式的下拉选项中要选中JSON类型,不要选Text、JavaScript等其他类型,选中后Postman会自动在请求头里加上Content-Type: application/json,告知服务端当前请求体为JSON格式。 - 第三步:修复登录判断的逻辑bug
原有判断条件里误用了逗号运算符,会直接忽略前面的邮箱校验逻辑,仅判断密码是否符合要求,需要把逗号改成逻辑与&&,才能同时校验邮箱和密码:function userLogin(strEmail, strPassword) { // 把原条件里的逗号替换为&& if (strEmail.includes("mike@gmail.com") && strPassword.includes("12345")) { return true; } else { return false; } }
修正后完整可运行代码
const express = require('express') const app = express() const port = 3000 // 挂载请求体解析中间件 app.use(express.json()) app.use(express.urlencoded({ extended: true })) app.post("/login", (req, res) => { res.send({ isUserRegistered: userLogin(req.body.strEmail, req.body.strPassword), }) }) function userLogin(strEmail, strPassword) { if (strEmail.includes("mike@gmail.com") && strPassword.includes("12345")) { return true; } else { return false; } } app.listen(port, () => { console.log(`服务运行在 http://localhost:${port}`) })
修改完成后重启服务,再用Postman发送原有请求,即可正常返回{"isUserRegistered":true}的预期结果。
内容的提问来源于stack exchange,提问作者abdalla ashraf
相关产品推荐
相关产品推荐

