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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:04:54