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

使用TypeScript+TypeORM向PostgreSQL插入数据失败求助

问题描述

使用TypeScript + TypeORM向PostgreSQL插入数据时出现异常:数据库连接正常,POST请求能正常触发,无报错信息,但数据未插入成功,页面直接重定向回注册页。手动插入数据、登录功能均正常。

相关代码

User.ts 实体

import { Entity, BaseEntity, Column, PrimaryGeneratedColumn } from "typeorm"

@Entity('user')
export class User extends BaseEntity {

    @PrimaryGeneratedColumn()
    id: number

    @Column({
        unique: true
    })
    username: string;

    @Column()
    password: string;

    @Column({
        default: false
    })
    isAdmin: boolean;
}

UserController.ts

import { Request, Response } from 'express';
import { getRepository } from 'typeorm';
import { User } from '../entities/User';
import * as bcrypt from 'bcryptjs';
import * as jwt from 'jsonwebtoken';

export class UserController {
    static async register(req: Request, res: Response) {
        const { username, password } = req.body;

        const userRepository = getRepository(User);

        // 检查用户名是否已存在
        const existingUser = await userRepository.findOne({ where: { username } });
        if (existingUser) {
            return res.status(400).render('register', { error: '用户名已被占用' });
        }

        if (!password) {
            return res.status(400).render('register', { error: '密码不能为空' });
        }

        // 密码哈希处理
        const hashedPassword = await bcrypt.hash(password, 10);

        // 创建新用户
        const user = userRepository.create({
            username: username,
            password: hashedPassword,
            isAdmin: true
        });
        await userRepository.save(user);

        res.redirect('/login');
    }
}

routes.ts

import express from 'express';
import { UserController } from "./controller/UserController";

const app = express();
// app.set('view engine', 'ejs');

export const router = express.Router();

router.get('/', (_, res) => {
    res.redirect('/register');
});

router.get('/register', (_, res) => {
    res.render('register', { error: null });
});

router.post('/register', UserController.register);
排查方向与解决方案
  1. 缺少请求体解析中间件
    当前代码未配置Express解析POST请求体的中间件,导致req.body为空,username或password不存在时,代码会提前返回渲染注册页。
    解决:在项目的主入口文件(如app.ts)中添加:

    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());
    
  2. 未捕获save操作的隐性错误
    即使数据库连接正常,save操作可能因约束冲突、连接池问题等隐性错误失败,但代码未捕获,导致直接执行重定向,数据未插入。
    解决:给save操作添加try-catch捕获错误:

    try {
        await userRepository.save(user);
        res.redirect('/login');
    } catch (err) {
        console.error('保存用户失败:', err);
        return res.status(500).render('register', { error: '注册失败,请重试' });
    }
    
  3. 实体与数据库表结构不匹配
    检查数据库中user表的字段是否与实体定义一致,比如isAdmin字段是否存在、类型是否正确。开发环境下可开启TypeORM的自动同步:
    在TypeORM配置中设置synchronize: true(生产环境不建议使用)。

  4. 中间件拦截响应
    检查是否存在全局中间件在UserController.register之后修改或拦截了响应,导致重定向逻辑异常。

内容的提问来源于stack exchange,提问作者hasibulfor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:10:42