使用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);
排查方向与解决方案
缺少请求体解析中间件
当前代码未配置Express解析POST请求体的中间件,导致req.body为空,username或password不存在时,代码会提前返回渲染注册页。
解决:在项目的主入口文件(如app.ts)中添加:app.use(express.urlencoded({ extended: true })); app.use(express.json());未捕获
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: '注册失败,请重试' }); }实体与数据库表结构不匹配
检查数据库中user表的字段是否与实体定义一致,比如isAdmin字段是否存在、类型是否正确。开发环境下可开启TypeORM的自动同步:
在TypeORM配置中设置synchronize: true(生产环境不建议使用)。中间件拦截响应
检查是否存在全局中间件在UserController.register之后修改或拦截了响应,导致重定向逻辑异常。
内容的提问来源于stack exchange,提问作者hasibulfor
相关产品推荐
相关产品推荐

