类型“string”与类型“FindOneOptions<User>”没有共同属性

bob*_*nes 17 node.js express typescript typeorm

我正在尝试用express.js 构建一个后端。我现在有以下问题:

import { Request, Response } from "express";
import { getManager } from "typeorm";
import { User } from "../entity/user.entity";


export const GetUser = async (req: Request, res: Response) => {
  const repository = getManager().getRepository(User);

  const { password, ...user } = await repository.findOne(req.params.id);

  res.send(user);
};
Run Code Online (Sandbox Code Playgroud)

总是出现以下错误:

(参数)req:Request<ParamsDictionary,any,any,QueryString.ParsedQs,Record<string,any>>类型“string”与类型“FindOneOptions”没有共同属性。ts(2559) 在此输入图像描述 路由器.ts

router.get("/api/users/:id", AuthMiddleware, GetUser);
Run Code Online (Sandbox Code Playgroud)

用户实体.ts

import {
  Column,
  Entity,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
} from "typeorm";
import { Role } from "./role.entity";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;
  @Column()
  first_name: string;
  @Column()
  last_name: string;
  @Column({
    unique: true,
  })
  email: string;
  @Column()
  password: string;

  @ManyToOne(() => Role)
  @JoinColumn({ name: "role_id" })
  role: Role;
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决我的问题吗?

Ash*_*hok 31

typeorm 的findOne功能相当于Select * ... limit 1. 这意味着findOne实际上期望包含条件的对象匹配并返回满足条件的第一个元素。

在你的情况下,代码应该是:

repository.findOne({where: {id: parseInt(req.params.id, 10)}})
Run Code Online (Sandbox Code Playgroud)

或者

repository.findOneBy({id: parseInt(req.params.id, 10)})
Run Code Online (Sandbox Code Playgroud)

这将找到其字段idreq.params.id.


Raw*_*anN 7

任何从NestJs v7迁移到v9 的人都会遇到这个问题,因为他们使用不同的 TypeORM 版本事实证明,这是TypeORM

方面的重大变化。 从v0.2.xv0.3.x有一个重大更改,他们放弃了该方法,转而 检查此处: https: //typeorm.io/changelog#writing-changes-1
findOne(id)findOneBy({where : {id: id}})

TypeORM 的重大变化

我有 TypeORM v0.3.12:
类型ORM版本

这里我得到同样的错误 错误

现在错误已解决:
在此输入图像描述

这个视频给我敲响了警钟: https://www.youtube.com/watch ?v=UEFEze_SQKU

  • [请不要发布文字截图](https://meta.stackoverflow.com/a/285557/354577)。它们无法被搜索或复制,甚至不能被屏幕阅读器等自适应技术的用户使用。相反,请将代码作为文本直接粘贴到您的问题中,然后选择它并单击代码块按钮。对于文档,将其标记为块引用。 (3认同)