Node.js+Express+Sqlite POST请求报读取undefined属性TypeError
问题原因与修复方案
报错TypeError: Cannot read properties of undefined (reading 'nome')(控制台显示的reading 'name'是字段语义转写,核心触发逻辑一致)的直接原因是:传入insertPessoas函数的pessoas参数值为undefined,代码尝试读取该值的nome属性时触发类型错误。
核心诱因:缺失Express请求体解析配置
Express 4.16及以上版本默认不会自动解析POST请求携带的请求体,如果你没有在入口文件配置对应解析中间件,路由中拿到的req.body会是undefined,将其作为参数传入insertPessoas时就会触发本次报错。
修复操作
在你的Express项目入口文件(通常为app.js/index.js)中,所有路由注册代码之前添加以下中间件配置:
// 解析JSON格式请求体 app.use(express.json()) // 解析x-www-form-urlencoded格式请求体 app.use(express.urlencoded({ extended: true }))
配置完成后重启服务,同时确认Insomnia端的请求配置:
- 发送POST请求时,请求体格式和
Content-Type请求头匹配 - 如果发送JSON格式参数,请求体结构需和字段对应,示例:
{ "nome": "张三", "idade": 25 }
附带修复:现有数据库操作代码的异步逻辑缺陷
你当前写的数据库操作方法没有等待异步执行完成、也没有参数校验和错误捕获,后续容易出现写入失败无感知、连接泄漏等问题,修正后的参考代码如下:
import { openDb } from "../configDB.js"; export async function createTable(){ const db = await openDb() await db.exec('CREATE TABLE IF NOT EXISTS Pessoas(id INTEGER PRIMARY KEY, nome TEXT, idade INTEGER)') } export async function insertPessoas(pessoas){ // 前置参数校验,提前拦截非法入参 if (!pessoas || typeof pessoas.nome !== 'string' || typeof pessoas.idade !== 'number') { throw new Error('参数非法:需传入合法的nome(字符串)和idade(数字)字段') } const db = await openDb() return db.run('INSERT INTO Pessoas (nome, idade) VALUES (?, ?)', [pessoas.nome, pessoas.idade]) }
快速验证方法
在insertPessoas函数第一行添加console.log('接收到的参数:', pessoas),重启服务后重新发请求:
- 如果控制台打印
undefined,说明上游传参异常,优先检查请求体中间件配置、Insomnia请求格式 - 如果能正常打印你传入的nome和idade字段,说明参数传递正常,错误已经修复
内容的提问来源于stack exchange,提问作者Sofia Morais
相关产品推荐
相关产品推荐

