You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:01:03