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

TypeORM配合Express使用时findOne返回Promise无法链式调用then/catch求助

问题根源

你代码的问题出在 userRepo.findOne() 调用行末尾多写了一个分号,打断了Promise链式调用:

// 错误写法:末尾多余分号
userRepo.findOne({ Person_Email: req.body.user_email.toString().toLowerCase() });
.then((user) => { ... })

这个分号会被JS解析器判定为当前语句结束,后面的.then()就变成了没有调用主体的独立非法语句,自然无法正常执行。


修复方案

  1. 首先删除findOne行末尾的多余分号,恢复链式调用结构
  2. 附带修复你代码里的其他隐藏问题:
    • 你的User实体主键字段是Person_ID,不是_id,后续生成token的地方需要修改字段名
    • uuid类型的主键数据类型应该是string,不是number,需要修正实体字段类型
    • bcrypt和jsonwebtoken都是默认导出,导入时不能加花括号
    • 如果你使用的是TypeORM 0.3+版本,findOne的参数需要用where字段包裹,需要对应调整参数结构

修复后完整代码

修正后的User实体

import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm";
import { Post } from "./Post";

@Entity( {name : "Table_Personnes"} )
export class User {
    // uuid类型改为string
    @PrimaryGeneratedColumn("uuid")
    Person_ID: string;

    @Column({ type: "varchar", length: 80})
    Person_Email: string;

    @Column()
    Person_Login: string;

    @Column()
    Person_Password: string;

    @Column()
    Person_Picture: string;

    @OneToMany( (type) => Post, (Post) => Post.User)
    Table_Post: Promise<Post[]>;
}

修正后的控制器代码

import {getRepository} from "typeorm";
import {NextFunction, Request, Response} from "express";

// 导入去掉花括号
import bcrypt from 'bcrypt'
import jwt from 'jsonwebtoken'

import {User} from "../entity/User";
import {Post} from "../entity/Post";

exports.login = (req, res, next) => {
    const userRepo = getRepository(User);
    // 删掉了末尾的分号,如果你用的是TypeORM 0.3+版本,参数要改成{ where: { Person_Email: ... } }
    userRepo.findOne({ Person_Email: req.body.user_email.toString().toLowerCase() })
    .then((user) => {
        console.log("User that logged in: ", user);
        if (!user) {
            return res.status(401).json({ error: 'User not found !' });
        }
        bcrypt.compare(req.body.password, user.Person_Password)
        .then(valid => {
            if (!valid) {
              return res.status(401).json({ error: 'wrong password !' });
            }
            res.status(200).json({
              // 把_id改成实体的主键Person_ID
              userId: user.Person_ID,
              token: jwt.sign(
                { userId: user.Person_ID },
                'RANDOM_TOKEN_SECRET',
                { expiresIn: '24h' }
              )
            });
        })
        .catch(error => res.status(500).json({ error }));
    })
    .catch(error => res.status(500).json({ error }));
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:06:02