TypeORM配合Express使用时findOne返回Promise无法链式调用then/catch求助
问题根源
你代码的问题出在 userRepo.findOne() 调用行末尾多写了一个分号,打断了Promise链式调用:
// 错误写法:末尾多余分号 userRepo.findOne({ Person_Email: req.body.user_email.toString().toLowerCase() }); .then((user) => { ... })
这个分号会被JS解析器判定为当前语句结束,后面的.then()就变成了没有调用主体的独立非法语句,自然无法正常执行。
修复方案
- 首先删除
findOne行末尾的多余分号,恢复链式调用结构 - 附带修复你代码里的其他隐藏问题:
- 你的User实体主键字段是
Person_ID,不是_id,后续生成token的地方需要修改字段名 uuid类型的主键数据类型应该是string,不是number,需要修正实体字段类型bcrypt和jsonwebtoken都是默认导出,导入时不能加花括号- 如果你使用的是TypeORM 0.3+版本,
findOne的参数需要用where字段包裹,需要对应调整参数结构
- 你的User实体主键字段是
修复后完整代码
修正后的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
相关产品推荐
相关产品推荐

