TypeORM集成MySQL:首次插入时间戳正常,后续插入异常
问题解决步骤
1. 修复数据源重复初始化问题
你现在每次请求都调用AppDataSource.initialize(),这会导致TypeORM连接状态异常,是核心问题之一。TypeORM的数据源初始化只需要做一次,不能每次请求都执行。
创建一个单独的数据库配置文件(比如db.ts):
import { DataSource } from "typeorm"; import { Companies } from "./path-to-your-Companies-entity"; export const AppDataSource = new DataSource({ // 填入你的数据库配置:type、host、port、username、password、database等 entities: [Companies], synchronize: process.env.NODE_ENV === "development", // 生产环境建议关闭,改用迁移脚本 }); // 全局仅初始化一次 if (!AppDataSource.isInitialized) { AppDataSource.initialize() .then(() => console.log("数据库连接成功")) .catch((err) => console.error("数据库连接失败:", err)); }
之后在createUser.js里直接导入这个已初始化的数据源,不要再重复调用initialize方法。
2. 修正实体定义
你的Companies实体存在两个关键问题:
- 主键
id未设置自增策略,TypeORM无法自动生成主键值,导致后续操作触发主键相关报错。 - 手动定义时间戳字段,没有利用TypeORM提供的自动时间戳装饰器。
修改后的实体代码:
// Companies.ts import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn } from "typeorm"; @Entity() export class Companies { @PrimaryGeneratedColumn() // 自动生成自增主键 id: number; @Column("varchar", { name: "name", length: 200 }) nome: string; @CreateDateColumn({ name: "createdAt" }) // 自动填充创建时间 createdAt: Date; @UpdateDateColumn({ name: "updatedAt" }) // 自动更新修改时间 updatedAt: Date; }
3. 修正createUser接口代码
- 移除重复的数据源初始化逻辑
- 修正变量名不匹配问题(原代码中
nomeEmpresa和companyName不一致) - 优化错误处理流程
修改后的接口代码:
// createUser.js import { AppDataSource } from "./db"; import { Companies } from "./path-to-your-Companies-entity"; export default async function createUser(req, res) { const { companyName } = req.body; if (!companyName) { return res.status(400).json({ response: "缺少公司名称参数" }); } try { // 确保数据源已初始化(兜底判断) if (!AppDataSource.isInitialized) { await AppDataSource.initialize(); } const companiesRepository = AppDataSource.getRepository(Companies); const newCompany = companiesRepository.create({ nome: companyName }); // 注意实体字段是nome,对应数据库的name const companyData = await companiesRepository.save(newCompany); res.status(200).json({ response: "公司创建成功", data: companyData }); } catch (err) { console.error(err); res.status(400).json({ response: "创建失败" }); } }
问题根源说明
- 重复初始化数据源会导致连接池混乱、实体元数据状态异常,这也是你尝试使用
@CreateDateColumn或默认值时触发主键错误的原因。 - 实体主键未设置自增策略,TypeORM无法正确追踪实体状态,进而引发插入/更新时的校验错误。
内容的提问来源于stack exchange,提问作者Caio Henrique
相关产品推荐
相关产品推荐

