Next.js中Prisma类型校验报错:unknown无法赋值给Post类型
解决Next.js API中Prisma返回数据的类型校验问题
核心问题分析
- 你自定义了
Post类型,但Prisma已经根据schema自动生成了类型,重复定义会导致类型不匹配 NextApiResponse<Post>指定的是单个Post对象,但prisma.post.findMany()返回的是Post数组,类型不匹配- catch中的
error是unknown类型,直接返回会触发类型校验错误
解决方案
1. 正确导入Prisma生成的类型和客户端
移除自定义的Post类型,直接使用Prisma自动生成的类型,同时全局实例化PrismaClient避免开发环境热重载重复创建:
import type { NextApiRequest, NextApiResponse } from "next"; import { PrismaClient, Post } from "@prisma/client"; const prisma = global.prisma || new PrismaClient(); if (process.env.NODE_ENV !== "production") global.prisma = prisma;
2. 修正API响应的类型定义
接口返回的是Post数组或错误信息,所以将NextApiResponse的泛型改为Post[] | { error: string }:
export default async function handler( req: NextApiRequest, res: NextApiResponse<Post[] | { error: string }> ) {
3. 正确处理数据返回和错误捕获
prisma.post.findMany()返回的类型已经是Post[],直接返回即可- 捕获错误时,先将
unknown类型转为Error,再返回错误信息:
if (req.method === "GET") { try { const data = await prisma.post.findMany(); return res.status(200).json(data); } catch (error) { const errorMessage = error instanceof Error ? error.message : "获取帖子失败"; return res.status(500).json({ error: errorMessage }); } } // 处理非GET请求 res.setHeader("Allow", ["GET"]); return res.status(405).json({ error: `不支持的请求方法 ${req.method}` });
完整修正后的代码
import type { NextApiRequest, NextApiResponse } from "next"; import { PrismaClient, Post } from "@prisma/client"; const prisma = global.prisma || new PrismaClient(); if (process.env.NODE_ENV !== "production") global.prisma = prisma; export default async function handler( req: NextApiRequest, res: NextApiResponse<Post[] | { error: string }> ) { if (req.method === "GET") { try { const data = await prisma.post.findMany(); return res.status(200).json(data); } catch (error) { const errorMessage = error instanceof Error ? error.message : "获取帖子失败"; return res.status(500).json({ error: errorMessage }); } } res.setHeader("Allow", ["GET"]); return res.status(405).json({ error: `不支持的请求方法 ${req.method}` }); }
内容的提问来源于stack exchange,提问作者Galanthus
相关产品推荐
相关产品推荐

