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

如何通过Prisma从SQL导入数据到React并避免Promise错误

解决React组件传入Promise而非数组的报错问题

问题描述

我尝试将MS SQL数据库中的数据导入React组件,却频繁遇到Promise错误。由于操作涉及异步函数,每次都会收到错误提示,称传入React的是Promise而非实际数组。请问如何解决该问题,实现通过Prisma将数据从TypeScript传入React组件且不触发Promise相关报错?

原代码

页面组件代码

export const getServerSideProps = async () => {
  const res = await fetch("http://localhost:8081/api/fRED_Market_Yield_10Y");
  const my10y = await res.json();
  return {
    props: { my10y },
  };
};

export function MY10Y({ my10y: [] }) {
  return (
    <div>
      {my10y?.map((p: { DateTime: Key | null | undefined; Value: boolean | ReactChild | ReactFragment | ReactPortal | null | undefined; }) => {
        return (
          <div key={p.DateTime}>
            <p>
              {p.Value}%
            </p>
          </div>
        );
      })}
    </div>
  );
}

API路由代码(pages/api/products.js)

import { Prisma, PrismaClient } from "@prisma/client";
import { Key, ReactChild, ReactFragment, ReactPortal } from "react";

let prisma: PrismaClient<Prisma.PrismaClientOptions, never, Prisma.RejectOnNotFound | Prisma.RejectPerOperation | undefined>;

prisma = new PrismaClient();

export default async function handle(req: any, res: { json: (arg0: any) => void; }) {
  const my10y = await prisma.fRED_Market_Yield_10Y.findMany();
  res.json(my10y);
}

问题分析与修复方案

1. 修复组件参数解构错误(核心问题)

原代码中MY10Y({ my10y: [] })的写法完全错误,这是把my10y重命名为空数组,会直接覆盖getServerSideProps传入的实际数据,导致组件内部拿到的不是数组而是空数组引用。

正确写法:用解构语法获取props,同时设置默认空数组避免undefined:

export function MY10Y({ my10y = [] }) {
  // 组件逻辑
}

2. 优化类型定义

手动写的p类型冗余且不准确,直接用Prisma自动生成的类型更可靠:

import { fRED_Market_Yield_10Y } from "@prisma/client";

// ...

export function MY10Y({ my10y = [] }: { my10y: fRED_Market_Yield_10Y[] }) {
  return (
    <div>
      {my10y.map((p) => (
        <div key={p.DateTime}>
          <p>{p.Value}%</p>
        </div>
      ))}
    </div>
  );
}

3. 简化数据获取流程(可选优化)

原代码通过fetch调用API路由拿数据,其实可以直接在getServerSideProps里调用Prisma,减少一次网络请求:

import { PrismaClient, fRED_Market_Yield_10Y } from "@prisma/client";

const prisma = new PrismaClient();

export const getServerSideProps = async () => {
  const my10y = await prisma.fRED_Market_Yield_10Y.findMany();
  return {
    props: { my10y },
  };
};

export function MY10Y({ my10y = [] }: { my10y: fRED_Market_Yield_10Y[] }) {
  return (
    <div>
      {my10y.map((p) => (
        <div key={p.DateTime}>
          <p>{p.Value}%</p>
        </div>
      ))}
    </div>
  );
}

4. 修复API路由类型(如果保留API路由)

给req和res加上Next.js的正确类型,避免使用any:

import { PrismaClient } from "@prisma/client";
import type { NextApiRequest, NextApiResponse } from "next";

const prisma = new PrismaClient();

export default async function handle(req: NextApiRequest, res: NextApiResponse) {
  const my10y = await prisma.fRED_Market_Yield_10Y.findMany();
  res.json(my10y);
}

修复后说明

修复后,getServerSideProps会在服务器端异步获取并解析出数组数据,再作为props传入组件。组件内部拿到的是实际数组而非Promise,就能正常用map渲染数据,不会再触发Promise相关报错。

内容的提问来源于stack exchange,提问作者Philip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:03:48