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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:12:21