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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:18:36