我正在使用sequentize Typescript作为ORM编写一个NestJS应用程序。
在这里,我试图让一个用户喜欢的工作(m:m),所以我有一个用户实体,一个工作实体(与这个问题无关)和一个喜欢的实体。
收藏夹.entity.ts

import { Table, Column, Model, PrimaryKey, ForeignKey, BelongsTo, NotNull } from "sequelize-typescript";
import { IDefineOptions } from "sequelize-typescript/lib/interfaces/IDefineOptions";
import { UserEntity } from "../users/user.entity";
import { JobEntity } from "../jobs/job.entity";

const tableOptions: IDefineOptions = {
  timestamp: true,
  tableName: "favorites",
  schema: process.env.DB_SCHEMA,
} as IDefineOptions;

@Table(tableOptions)
export class FavoriteEntity extends Model<FavoriteEntity> {
  @BelongsTo(() => UserEntity)
  user: UserEntity;

  @ForeignKey(() => UserEntity)
  @PrimaryKey
  @NotNull
  @Column
  userId: number;

  @BelongsTo(() => JobEntity)
  job: JobEntity;

  @ForeignKey(() => JobEntity)
  @PrimaryKey
  @NotNull
  @Column
  jobId: number;
}

收藏夹.service.ts
import { Inject, Injectable } from "@nestjs/common";
import { Model } from "sequelize-typescript";
import { IFavorite, IFavoriteService } from "./interfaces";
import { FavoriteEntity } from "./favorite.entity";

@Injectable()
export class FavoriteService implements IFavoriteService {
  constructor(
    @Inject("FavoriteRepository") private readonly favoriteRepository: typeof Model,
    @Inject("SequelizeInstance") private readonly sequelizeInstance,
  ) {}

  public async findByUserId(userId: number): Promise<FavoriteEntity | null> {
    return await FavoriteEntity.scope().findAll<FavoriteEntity>({
      where: { userId },
    });
  }
}

我收到一个我真的不明白的类型错误:
错误:⨯无法编译类型脚本:
src/modules/favorite/favorite.service.ts(21,5):错误TS2322:Type
“FavoriteEntity[]”不能分配给“FavoriteEntity | null”类型。
“FavoriteEntity[]类型不能分配给”“FavoriteEntity”“类型。”。
类型“FavoriteEntity[]中缺少属性“user”。
我不明白为什么它在抱怨一个失踪的user,很明显它就在那里。(如果我让它成为可选的(?)在实体中,它会抱怨下一个属性,直到我将它们全部设为可选,然后它会以同样的方式抱怨缺少属性数据值)
我错过了什么?
谢谢!
更新:
所以我可能想了些办法。如果我这样写
return await FavoriteEntity.scope().findAll<FavoriteEntity[]>({
  where: { userId },
});

FavoriteEntity[]代替FavoriteEntity,我得到
“FavoriteEntity[]类型中缺少属性“dataValues”
我真的不知道哪种写法是正确的,但是我还是有一个问题。。。

最佳答案

findAll将返回一个实体数组。您只需要一个或空。为此,请使用findOne。另外,您不需要在这里执行return await操作。除非在try-catch块中,否则这是多余的。

09-19 07:33