ค้นหาเว็บไซต์

typescript - เกิดข้อผิดพลาดเมื่อใช้ Prisma กับ tRPC: ประเภทการคืนค่าของฟังก์ชันที่ส่งออกมีหรือใช้ชื่อ 'prisma' จากโมดูลภายนอก


ฉันกำลังพยายามรวม Prisma เข้ากับ tRPC สำหรับแบ็กเอนด์ของฉัน ทั้งคู่ทำงานได้ดีเมื่อใช้งานแยกกัน แต่เมื่อฉันพยายามรวมพวกมันเข้าด้วยกัน จะเกิดข้อผิดพลาดขึ้น

นี่คือข้อความแสดงข้อผิดพลาดที่ฉันได้รับ:

TS4058: ประเภทค่าที่ส่งคืนของฟังก์ชันที่ส่งออกมีหรือกำลังใช้ชื่อ 'prisma' จากโมดูลภายนอก "/Users/nils/Code/nextjs-coespace/node_modules/.prisma/client/index" แต่ไม่สามารถตั้งชื่อได้

ไฟล์ที่ฉันได้ไคลเอนต์ Prisma ของฉันมาจาก:

// Note! This file has been copied from:
// https://github.com/prisma/prisma-examples/blob/latest/typescript/rest-nextjs-api-routes-auth/lib/prisma.ts

import { PrismaClient } from '@prisma/client';

// PrismaClient is attached to the `global` object in development to prevent
// exhausting your database connection limit.
//
// Learn more:
// https://pris.ly/d/help/next-js-best-practices

// eslint-disable-next-line import/no-mutable-exports
let prisma: PrismaClient;

if (process.env.NODE_ENV === 'production') {
  prisma = new PrismaClient();
} else {
  if (!global.prisma) {
    global.prisma = new PrismaClient();
  }
  prisma = global.prisma;
}

export default prisma;

ตัวควบคุม tRPC ของฉัน:

import createRouter from '@/src/lib/server/trpc/routers/router';
import prisma from '@/src/lib/server/prisma';
import { z } from 'zod';

export default function locationRouter() {
  return createRouter()
    .mutation('create', {
      input: z.object({
        id: z.string().uuid(),
        // ...
      }),
      resolve(req) {
        return prisma.location.create({
          data: req.input,
        });
      },
    })
    .query('findMany', {
      resolve() {
          return prisma.location.findMany()
      },
    });
}

คำตอบ #1

ฉันคิดว่ามันคล้ายกับอันนี้

ฉันเคยมีปัญหาแบบเดียวกัน ซึ่งฉันแก้ไขโดยการแสดงคำสั่งนั้น

คำตอบ #2

คุณกำลังส่งคืน promise ที่ครอบ prisma จากการ resolve ของคุณ ซึ่งหมายความว่า prisma เป็นส่วนหนึ่งของประเภทการคืนค่า นำไปสู่ข้อความข้อผิดพลาด ข้อความข้อผิดพลาดสามารถเข้าใจได้หากคุณพิจารณาเรื่องนี้

วิธีแก้คือการ await ผลลัพธ์อย่างชัดเจน ซึ่งทำให้ prisma ไม่ อยู่ใน resolve แน่นอนว่าคุณยังคงส่งคืน promise แต่ await นั้นป้องกันไม่ให้ prisma ถูกส่งออกพร้อมกับ export type LocationRouter=typeof locationRouter ถ้าคุณวางเมาส์บน resolve คุณจะเห็นลายเซ็นว่า

(property) resolve: ProcedureResolver<unknown, undefined, trpc.InferLast<Promise<template[]> & {
    [prisma]: true;
}>>

การแก้ไขต่อไปนี้แก้ไขข้อผิดพลาดของฉัน (และอาจของคุณด้วย):

  .query("findMany", {
    resolve: async () => {
      return await prisma.location.findMany()
    },
  })

ด้วย await ลายเซ็นของ resolve ตอนนี้คือ

(property) resolve: ProcedureResolver<unknown, undefined, template[]>

คุณจะต้องทำสิ่งนี้สำหรับ resolve ทุกตัวที่ใช้ prisma