Prisma 和 node.js 复杂模块问题
Prisma and node.js complex module issues
我会尽力重现这种情况下的问题。如果我不能很好地理解这一点,我可能会删除它。我的开发环境包括docker
和node.js
我的 Prisma 架构中有 7 个模型:
用户
审计日志
金融
金库交易
帝国
战争日志条目
结构
prisma 模式是这样布局的
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.
这是模型 Finance
的 finance.service.ts
文件。 return 类型包括类型为模型 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
您的 return 类型不正确,因为它不仅 returning Finance
数据,而且 transactions
inside 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,
},
});
}
}
我会尽力重现这种情况下的问题。如果我不能很好地理解这一点,我可能会删除它。我的开发环境包括docker
和node.js
我的 Prisma 架构中有 7 个模型:
用户 审计日志 金融 金库交易 帝国 战争日志条目 结构
prisma 模式是这样布局的
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.
这是模型 Finance
的 finance.service.ts
文件。 return 类型包括类型为模型 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
您的 return 类型不正确,因为它不仅 returning Finance
数据,而且 transactions
inside 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,
},
});
}
}