DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Prisma 7 提示 @prisma/client 没有 PrismaClient,检查生成目录与导入路径

prisma-client 生成器将客户端输出到自定义目录时,继续从 @prisma/client 导入可能报导出缺失。核对生成路径、adapter、模块格式与镜像产物。

Prisma 7 提示 @prisma/client 没有 PrismaClient,检查生成目录与导入路径

TypeScript 提示 Module '"@prisma/client"' has no exported member 'PrismaClient',删除 node_modules 再装一遍仍然没用时,先打开 schema 的 generator。若配置是 provider = "prisma-client",并指定了 output,客户端会生成到这个目录;业务代码继续从 @prisma/client 导入,就可能读错入口。

例如 NestJS 11 的 PostgreSQL 项目,Prisma 与 @prisma/client 声明为 ^7.1.0,把客户端输出到 ../generated/prisma 后,服务应改用生成目录中的客户端入口,并配置 PostgreSQL adapter。这里解决的是生成产物位置与导入位置不一致,不代表任何 TS2305 都由 Prisma 7 引起。

假设 schema 位于 prisma/schema.prisma:

generator client {
  provider = "prisma-client"
  output   = "../generated/prisma"
}

datasource db {
  provider = "postgresql"
}

运行项目本地的 CLI:

npx prisma version
npx prisma generate

观察生成命令打印的目标目录。output 相对 schema 文件解析,因此上例目标是项目根目录的 generated/prisma。导入路径则相对业务代码文件计算,两者的起点不同。

例如服务文件在 src/prisma/prisma.service.ts,可以使用:

import { Injectable } from '@nestjs/common';
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '../../generated/prisma/client';

@Injectable()
export class PrismaService extends PrismaClient {
  constructor() {
    const connectionString = process.env.DATABASE_URL;
    if (!connectionString) throw new Error('DATABASE_URL is missing');
    super({ adapter: new PrismaPg({ connectionString }) });
  }
}

这段代码针对直接连接 PostgreSQL 的 adapter 配置。Prisma Accelerate 使用不同的连接方式,不能把 prisma:// 地址直接交给 PrismaPg。同样,导入是否需要 .js 扩展名取决于项目的 ESM、TypeScript 和构建方式,应该保持生成代码、应用模块格式和运行时一致。

先解决导出错误,再看模块格式

改完导入后运行类型检查和项目构建:

npx tsc --noEmit
npm run build

如果接着出现 exports is not defined in ES module scope,说明已经进入另一个问题:CommonJS 产物被按 ESM 执行。此时检查 package.json 的 type、tsconfig.json 的 module,以及 generator 的 moduleFormat。不要只修改其中一个开关,也不要为消除编译错误随意把整个项目切换模块体系。

CI 和镜像也必须执行生成步骤,并把生成目录纳入构建、打包与运行所需文件。不要手工往 node_modules/.prisma 填文件,这会掩盖配置错误,并在下一次安装时丢失。

最后用构建产物启动应用,验证一次只读查询与正常关闭。编辑器不再画红线只证明类型解析恢复;生成目录漏进镜像、数据库 URL 缺失或 adapter 配置错误,仍可能在运行时失败。如果 generator 仍是旧 prisma-client-js,应按该生成器的入口排查,不能直接套用本文的自定义目录规则。