【问题标题】:Prisma and node.js complex module issuesPrisma 和 node.js 复杂模块问题
【发布时间】:2021-10-26 15:01:34
【问题描述】:

我将尽力重现这种情况下的问题。如果我不能很好地理解这一点,我可能会删除它。我的开发环境包括dockernode.js

我的 prisma 架构中有 7 个模型:

用户 审计日志 金融 保险柜交易 帝国 战争日志条目 结构

棱镜模式是这样布局的

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id       String     @id @default(uuid())
  username String
  mail     String
  audit    AuditLog[]
  empire   Empire?
}

model AuditLog {
  id      String   @id @default(uuid())
  userId  String   @map("user_id")
  user    User     @relation(fields: [userId], references: [id])
  time    DateTime
  ip      String
  client  String
  i18nKey String   @map("i18n_key")
}

model Finance {
  id           String             @id @default(uuid())
  gold         Float              @default(0)
  vaultGold    Float              @default(0)
  transactions VaultTransaction[]
  empireId     String             @map("empire_id")
  empire       Empire             @relation(fields: [empireId], references: [id])
}

model VaultTransaction {
  id        String  @id @default(uuid())
  financeId String  @map("finance_id")
  finance   Finance @relation(fields: [financeId], references: [id])
  i18nKey   String  @map("i18n_key")
  amount    Float
}

model Empire {
  id             String        @id @default(uuid())
  userId         String        @map("user_id")
  user           User          @relation(fields: [userId], references: [id])
  bannerId       Int           @default(0) @map("banner_id")
  description    String?
  armory         Json
  population     Json
  level          Int           @default(0)
  experience     Int           @default(0)
  attributes     Json
  turnsAvailable Int           @map("turns_available")
  race           String
  class          String
  finance        Finance?
  attacks        WarLogEntry[] @relation("empire_attacks")
  defenses       WarLogEntry[] @relation("empire_defenses")
  structures     Structure[]
}

model WarLogEntry {
  id         String @id @default(uuid())
  battleType String @map("battle_type")
  attackerID String @map("attacker_id")
  attacker   Empire @relation("empire_attacks", fields: [attackerID], references: [id])
  defenderID String @map("defender_id")
  defender   Empire @relation("empire_defenses", fields: [defenderID], references: [id])
  turns   Int
  details Json
}
model Structure {
  id         String @id @default(uuid())
  empireId   String @map("empire_id")
  empire     Empire @relation(fields: [empireId], references: [id])
  i18nKey    String @map("i18n_key")
  category   String
  attributes Json
}

我有每个模型的类型文件、解析器文件、服务文件和模块文件,但 prisma 似乎有一些奇怪的错误。我相信它们是循环依赖错误,但我修复了类型文件以使每个复杂模块 @Field 可选,因此应该修复它。

我当前的错误node.js 就是这样(它们会根据我编辑文件的方式略有变化)看起来这是一个棱镜问题。

[10:14:54 AM] Starting compilation in watch mode...

src/model/empire/empire.service.ts:8:5 - error TS2322: Type '(Empire & { finance: Finance; attacks: WarLogEntry[]; defenses: WarLogEntry[]; structures: Structure[]; })[]' is not assignable to type 'Empire[]'.
  Type 'Empire & { finance: Finance; attacks: WarLogEntry[]; defenses: WarLogEntry[]; structures: Structure[]; }' is not assignable to type 'Empire'.
    The types of 'finance.gold' are incompatible between these types.
      Type 'Decimal' is not assignable to type 'number'.

  8     return prisma.empire.findMany({
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9       include: {
    ~~~~~~~~~~~~~~~~
... 
 14       },
    ~~~~~~~~
 15     });
    ~~~~~~~

src/model/finance/finance.service.ts:8:5 - error TS2322: Type '(Finance & { transactions: VaultTransaction[]; })[]' is not assignable to type 'Finance[]'.
  Type 'Finance & { transactions: VaultTransaction[]; }' is not assignable to type 'Finance'.
    Types of property 'gold' are incompatible.
      Type 'Decimal' is not assignable to type 'number'.

  8     return prisma.finance.findMany({
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9       include: {
    ~~~~~~~~~~~~~~~~
... 
 11       },
    ~~~~~~~~
 12     });
    ~~~~~~~

src/model/vault-transaction/vault-transaction.service.ts:8:5 - error TS2322: Type 'import("/home/paul/dukesthrone/DukesThrone/dt-backend/node_modules/.pnpm/@prisma+client@2.28.0_prisma@2.28.0/node_modules/.prisma/client/index").VaultTransaction[]' is not assignable to type 'import("/home/paul/dukesthrone/DukesThrone/dt-backend/src/model/types/vault-transaction.type").VaultTransaction[]'.
  Type 'import("/home/paul/dukesthrone/DukesThrone/dt-backend/node_modules/.pnpm/@prisma+client@2.28.0_prisma@2.28.0/node_modules/.prisma/client/index").VaultTransaction' is not assignable to type 'import("/home/paul/dukesthrone/DukesThrone/dt-backend/src/model/types/vault-transaction.type").VaultTransaction'.
    Types of property 'amount' are incompatible.
      Type 'Decimal' is not assignable to type 'number'.

8     return prisma.vaultTransaction.findMany();
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[10:14:56 AM] Found 3 errors. Watching for file changes.

这是模型Financefinance.service.ts 文件。返回类型包括型号为VaultTransactions的交易

@Injectable()
export class FinanceService {
  async getFinances(): Promise<Finance[]> {
    return prisma.finance.findMany({
      include: {
        transactions: true,
      },
    });
  }
}

更新:我不确定这是否相关,但我认为可能是。 它是 github 上的一个问题跟踪器,用于 node.js 中的循环依赖。 https://github.com/MichalLytek/type-graphql/pull/237

【问题讨论】:

  • finance.service.ts中函数的返回类型是什么?我认为您指定的返回类型和 Prisma 返回的内容不匹配。
  • 我要在这里添加finance.service.ts文件

标签: node.js typescript graphql circular-dependency prisma


【解决方案1】:

您的返回类型不正确,因为它不仅返回 Finance 数据,还返回 transactions 内部 Finance

类型应该是:

import { Prisma } from '@prisma/client'

type GetFinances = Prisma.FinanceGetPayload<{
  include: { transactions: true }
}>

@Injectable()
export class FinanceService {
  async getFinances(): Promise<GetFinances[]> {
    return prisma.finance.findMany({
      include: {
        transactions: true,
      },
    });
  }
}

【讨论】:

  • 解决了service.ts,但问题转移到了resolver.ts 文件。我应该发一个新帖子吗?
  • 能够通过向所有解析器文件添加相同类型来修复
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 2014-01-01
  • 2013-11-09
  • 2022-08-04
  • 1970-01-01
  • 2016-07-20
  • 2021-06-21
  • 2019-07-09
相关资源
最近更新 更多