You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

升级Prisma至v7后遭遇TypeError卡壳问题求助

升级Prisma至v7后遭遇TypeError卡壳问题求助

问题背景

我在将Prisma升级到v7后,其他错误都修复了,但卡在了路径相关的TypeError上。以下是我的相关代码和错误信息:

Prisma Schema (schema.prisma)

datasource db {
  provider = "postgresql"
}

generator client {
  provider = env("CLIENT_PROVIDER")
}

model User {
  userId       Int       @id @default(autoincrement()) @map("user_id")
  name         String
  email        String    @unique
  password     String
  status       String    @default("ACTIVE")
  isSuperAdmin Boolean   @default(false) @map("is_super_admin")
  createdAt    DateTime  @default(now()) @map("created_at")
  otps         Otp[]
  auditLogs    AuditLog[]

  @@map("users")
  @@index([name])
}

Prisma Service (prisma.service.ts)

import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
  async onModuleInit() {
    await this.$connect();
  }

  async onModuleDestroy() {
    await this.$disconnect();
  }
}

Prisma Module (prisma.module.ts)

import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';

@Global()
@Module({
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}

Prisma Config (prisma.config.ts)

import { defineConfig, env } from "@prisma/config";
import dotenv from "dotenv";
import path from "path";

dotenv.config({ path: path.resolve(process.cwd(), ".env") });

export default defineConfig({
  schema: "src/shared/database/prisma/schema.prisma",
  datasource: {
    url: env("DATABASE_URL"),
  },
});

错误信息

npm run start
> servers-monitor@0.0.1 start
> nest start

(node:127213) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
(Use `node --trace-deprecation ...` to show where the warning was created)
[Nest] 127247 - 11/23/2025, 1:56:22 PM LOG [NestFactory] Starting Nest application...
[Nest] 127247 - 11/23/2025, 1:56:22 PM ERROR [ExceptionHandler] TypeError [ERR_INVALID_ARG_TYPE]: The "paths[1]" argument must be of type string. Received undefined

问题分析与解决方案

这个错误是路径参数未被正确解析为字符串导致的,和Prisma v7对配置文件的路径解析逻辑变化直接相关。我给你几个针对性的修复步骤:

1. 修复Prisma Config中的Schema路径解析

Prisma v7对相对路径的解析更严格,直接写相对路径可能导致解析失败。改成绝对路径确保Prisma能准确找到schema文件:

// 修改后的prisma.config.ts
import { defineConfig } from "@prisma/config";
import dotenv from "dotenv";
import path from "path";

dotenv.config({ path: path.resolve(process.cwd(), ".env") });

export default defineConfig({
  // 使用path.join结合process.cwd()生成绝对路径
  schema: path.join(process.cwd(), "src/shared/database/prisma/schema.prisma"),
  datasource: {
    // 直接使用process.env,避免@prisma/config的env函数可能的兼容性问题
    url: process.env.DATABASE_URL,
  },
});

2. 重新生成Prisma Client

升级Prisma版本后,必须重新生成客户端以适配v7的新结构:

npx prisma generate

3. 清除依赖缓存(可选但推荐)

旧的依赖缓存可能导致奇怪的兼容性问题,彻底清理后重新安装:

rm -rf node_modules package-lock.json
npm install

4. 验证Prisma Service的初始化(可选)

如果还是有问题,可以尝试在PrismaService的构造函数里显式传入datasourceUrl,跳过config的间接配置:

// 修改后的prisma.service.ts
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
  constructor() {
    super({
      datasourceUrl: process.env.DATABASE_URL,
    });
  }

  async onModuleInit() {
    await this.$connect();
  }

  async onModuleDestroy() {
    await this.$disconnect();
  }
}

为什么会出现这个错误?

Prisma v7重构了配置加载逻辑,对路径的校验更严格。你原来的config里直接用相对路径"src/shared/database/prisma/schema.prisma",在某些环境下可能被解析为undefined,触发了TypeError。改用绝对路径后,Prisma能稳定找到schema文件,解决这个参数类型错误。

按照上面的步骤试一下,应该能解决你的问题,如果还有疑问可以再补充细节~

火山引擎 最新活动