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,应按该生成器的入口排查,不能直接套用本文的自定义目录规则。


