typescript - Fel vid användning av Prisma med tRPC: Returtyp av exporterad funktion har eller använder namn 'prisma' från extern modul
Jag försöker integrera Prisma med tRPC för min backend. Båda fungerar bra var för sig, men när jag försöker integrera dem med varandra uppstår ett fel.
Det här är felmeddelandet jag får:
TS4058: Returtyp för exporterad funktion har eller använder namnet 'prisma' från extern modul "/Users/nils/Code/nextjs-coespace/node_modules/.prisma/client/index" men kan inte namnges
Filen jag får min Prisma-klient från:
// 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;
Min tRPC-kontroller:
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()
},
});
}
Svar #1
Jag tror att det är likt detta
Jag hade ett liknande problem, som jag löste genom att visa uttalandet
Svar #2
Du returnerar ett promise som kapslar in prisma från din resolve, vilket betyder att prisma är en del av returtypen, vilket leder till felmeddelandet. Felmeddelandet är logiskt om du tänker på det.
Lösningen är att await resultatet explicit, vilket leder till att prisma inte är i resolve. Du returnerar fortfarande ett löfte förstås, men det await förhindrar att prisma exporteras med export type LocationRouter=typeof locationRouter. Om du hovrar över resolve kommer du att se att signaturen är
(property) resolve: ProcedureResolver<unknown, undefined, trpc.InferLast<Promise<template[]> & {
[prisma]: true;
}>>
Följande åtgärdar mitt fel (och eventuellt ditt):
.query("findMany", {
resolve: async () => {
return await prisma.location.findMany()
},
})
Med await är signaturen för resolve nu
(property) resolve: ProcedureResolver<unknown, undefined, template[]>
Du kommer att behöva göra detta för varje resolve som använder prisma.
