如何修复 Prisma Client 自定义模型未定义的问题

Kri*_*aul 5 javascript rest express typescript prisma

我从typescript-express-starter生成了一个项目,并选择Prisma作为 ORM。启动项目生成的基本“用户”模型运行良好。我创建了一个模型“产品”作为现有的“用户”模型。我将其添加到schema.prisma中并创建了 products.services.ts。

import { PrismaClient, Product } from '@prisma/client';
import { CreateProductDto } from '@dtos/products.dto';
import HttpException from '@exceptions/HttpException';
import { isEmpty } from '@utils/util';

class ProductService {
  public products = new PrismaClient().product;

  public async findAllProducts(): Promise<Product[]> {
    const allProducts: Product[] = await this.products.findMany();
    return allProducts;
  }

  
}

export default ProductService;
Run Code Online (Sandbox Code Playgroud)

问题是PrismaClient().user返回 prisma 模型,但PrismaClient().product返回未定义。生成的 PrismaClient 打字稿文件具有产品模型和关联方法,并且也显示在 VS Code 提示中。但是,当运行项目时,PrismaClient().products 返回未定义而不是实际模型。运行 prisma studio 时,它会显示模型。

产品型号 - API 请求失败

用户模型 - 成功的 API 请求

工作室中的 Prisma 模型

Prisma Studio 中的用户模型

Prisma Studio 中的产品模型

我无法从可用的文档或论坛中找到任何解决方案。我最可能的猜测是我缺少一些需要添加才能工作的配置或文件。但我不知道那可能是在哪里、是什么。请帮忙。

这是new PrismaClient()的日志。

server        | PrismaClient:  <ref *1> NewPrismaClient [PrismaClient] {
server        |   _middlewares: [],
server        |   _engineMiddlewares: [],
server        |   _transactionId: 1,
server        |   _rejectOnNotFound: undefined,
server        |   _clientVersion: '2.23.0',
server        |   _activeProvider: 'mysql',
server        |   _errorFormat: 'colorless',
server        |   _dmmf: DMMFClass {
server        |     outputTypeToMergedOutputType: [Function (anonymous)],
server        |     datamodel: { enums: [], models: [Array] },
server        |     schema: {
server        |       inputObjectTypes: [Object],
server        |       outputObjectTypes: [Object],
server        |       enumTypes: [Object]
server        |     },
server        |     mappings: { modelOperations: [Array], otherOperations: [Object] },
server        |     enumMap: { UserScalarFieldEnum: [Object], SortOrder: [Object] },
server        |     datamodelEnumMap: {},
server        |     queryType: {
server        |       name: 'Query',
server        |       fields: [Array],
server        |       isEmbedded: false,
server        |       fieldMap: [Object]
server        |     },
server        |     mutationType: {
server        |       name: 'Mutation',
server        |       fields: [Array],
server        |       isEmbedded: false,
server        |       fieldMap: [Object]
server        |     },
server        |     modelMap: { User: [Object] },
server        |     outputTypes: { model: [Array], prisma: [Array] },
server        |     outputTypeMap: {
server        |       User: [Object],
server        |       Query: [Object],
server        |       Mutation: [Object],
server        |       AggregateUser: [Object],
server        |       UserGroupByOutputType: [Object],
server        |       AffectedRowsOutput: [Object],
server        |       UserCountAggregateOutputType: [Object],
server        |       UserAvgAggregateOutputType: [Object],
server        |       UserSumAggregateOutputType: [Object],
server        |       UserMinAggregateOutputType: [Object],
server        |       UserMaxAggregateOutputType: [Object]
server        |     },
server        |     inputObjectTypes: { prisma: [Array] },
server        |     inputTypeMap: {
server        |       UserWhereInput: [Object],
server        |       UserOrderByInput: [Object],
server        |       UserWhereUniqueInput: [Object],
server        |       UserScalarWhereWithAggregatesInput: [Object],
server        |       UserCreateInput: [Object],
server        |       UserUncheckedCreateInput: [Object],
server        |       UserUpdateInput: [Object],
server        |       UserUncheckedUpdateInput: [Object],
server        |       UserCreateManyInput: [Object],
server        |       UserUpdateManyMutationInput: [Object],
server        |       UserUncheckedUpdateManyInput: [Object],
server        |       IntFilter: [Object],
server        |       StringFilter: [Object],
server        |       IntWithAggregatesFilter: [Object],
server        |       StringWithAggregatesFilter: [Object],
server        |       StringFieldUpdateOperationsInput: [Object],
server        |       IntFieldUpdateOperationsInput: [Object],
server        |       NestedIntFilter: [Object],
server        |       NestedStringFilter: [Object],
server        |       NestedIntWithAggregatesFilter: [Object],
server        |       NestedFloatFilter: [Object],
server        |       NestedStringWithAggregatesFilter: [Object]
server        |     },
server        |     mappingsMap: { User: [Object] },
server        |     rootFieldMap: {
server        |       findFirstUser: [Object],
server        |       findManyUser: [Object],
server        |       aggregateUser: [Object],
server        |       groupByUser: [Object],
server        |       findUniqueUser: [Object],
server        |       createOneUser: [Object],
server        |       upsertOneUser: [Object],
server        |       createManyUser: [Object],
server        |       deleteOneUser: [Object],
server        |       updateOneUser: [Object],
server        |       updateManyUser: [Object],
server        |       deleteManyUser: [Object],
server        |       executeRaw: [Object],
server        |       queryRaw: [Object]
server        |     }
server        |   },
server        |   _previewFeatures: [],
server        |   _engineConfig: {
server        |     cwd: '/app/src/prisma',
server        |     dirname: '/app/node_modules/.prisma/client',
server        |     enableDebugLogs: false,
server        |     enableEngineDebugMode: undefined,
server        |     datamodelPath: '/app/node_modules/.prisma/client/schema.prisma',
server        |     prismaPath: undefined,
server        |     engineEndpoint: undefined,
server        |     datasources: [],
server        |     generator: {
server        |       name: 'client',
server        |       provider: [Object],
server        |       output: [Object],
server        |       config: {},
server        |       binaryTargets: [],
server        |       previewFeatures: []
server        |     },
server        |     showColors: false,
server        |     logLevel: undefined,
server        |     logQueries: undefined,
server        |     env: {
server        |       PORT: '3000',
server        |       DATABASE_URL: 'mysql://root:password@mysql:3306/prisma'
server        |     },
server        |     flags: [],
server        |     clientVersion: '2.23.0',
server        |     previewFeatures: [],
server        |     useUds: undefined,
server        |     activeProvider: 'mysql'
server        |   },
server        |   _engine: NodeEngine {
server        |     startCount: 0,
server        |     previewFeatures: [],
server        |     useUds: false,
server        |     stderrLogs: '',
server        |     handleRequestError: [AsyncFunction (anonymous)],
server        |     dirname: '/app/node_modules/.prisma/client',
server        |     env: {
server        |       PORT: '3000',
server        |       DATABASE_URL: 'mysql://root:password@mysql:3306/prisma'
server        |     },
server        |     cwd: '/app/src/prisma',
server        |     enableDebugLogs: false,
server        |     enableEngineDebugMode: false,
server        |     datamodelPath: '/app/node_modules/.prisma/client/schema.prisma',
server        |     prismaPath: undefined,
server        |     generator: {
server        |       name: 'client',
server        |       provider: [Object],
server        |       output: [Object],
server        |       config: {},
server        |       binaryTargets: [],
server        |       previewFeatures: []
server        |     },
server        |     datasources: [],
server        |     logEmitter: EventEmitter {
server        |       _events: [Object: null prototype],
server        |       _eventsCount: 1,
server        |       _maxListeners: undefined,
server        |       [Symbol(kCapture)]: false
server        |     },
server        |     showColors: false,
server        |     logLevel: undefined,
server        |     logQueries: false,
server        |     clientVersion: '2.23.0',
server        |     flags: [],
server        |     activeProvider: 'mysql',
server        |     engineEndpoint: undefined,
server        |     platformPromise: Promise { <pending> },
server        |     getConfigPromise: Promise { <pending> }
server        |   },
server        |   _fetcher: PrismaClientFetcher {
server        |     prisma: [Circular *1],
server        |     debug: false,
server        |     hooks: undefined,
server        |     dataloader: Dataloader { options: [Object], tickActive: false, batches: {} }
server        |   },
server        |   user: {
server        |     findUnique: [Function (anonymous)],
server        |     findFirst: [Function (anonymous)],
server        |     findMany: [Function (anonymous)],
server        |     create: [Function (anonymous)],
server        |     createMany: [Function (anonymous)],
server        |     delete: [Function (anonymous)],
server        |     update: [Function (anonymous)],
server        |     deleteMany: [Function (anonymous)],
server        |     updateMany: [Function (anonymous)],
server        |     upsert: [Function (anonymous)],
server        |     count: [Function (anonymous)],
server        |     aggregate: [Function (anonymous)],
server        |     groupBy: [Function (anonymous)]
server        |   }
server        | }
Run Code Online (Sandbox Code Playgroud)

小智 11

今天我也遇到了同样的问题,直到我了解到每次更改文件后schema.prisma,我都需要运行:

npx prisma generate
Run Code Online (Sandbox Code Playgroud)

然后还生成迁移

npx prisma migrate dev --name name_of_stuff
Run Code Online (Sandbox Code Playgroud)

但它是第一个修复了您上面提到的确切错误的。


小智 5

我早些时候遇到过类似的问题。为了解决这个问题,我添加了一个自定义路径,用于在 schema.prisma 文件内生成 prisma 客户端,如下所示 -

generator client {
  provider = "prisma-client-js"
  output   = "./src/generated/client"
}
Run Code Online (Sandbox Code Playgroud)

然后从输出路径导入 prisma 客户端,如下所示 -

const { PrismaClient } = require('./src/generated/client')
const prisma = new PrismaClient()
Run Code Online (Sandbox Code Playgroud)

这可确保您在导入 prisma 客户端时不会引用任何错误的路径。


Rya*_*yan 0

它应该只是:

public products = new PrismaClient();
Run Code Online (Sandbox Code Playgroud)

然后你就可以使用this.products.findMany().

注意:虽然这不是正确的方法。建议在整个项目中使用 PrismaClient 的单个实例。