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

如何在Next.js中通过Prompt获取特定格式流式数据并展示到组件?

如何在Next.js中获取并展示指定格式的Prompt数据

一、先搞定数据来源

不管是调用AI接口还是本地模拟,核心是让返回数据严格符合索引: data: 内容的结构:

1. 调用AI接口时的Prompt写法

如果是让GPT这类模型返回这种格式,直接把格式要求写死在Prompt里:

请严格按照以下格式返回结果,不要添加任何额外内容:
0: data: 内容1
1: data: 内容2

这样AI返回的文本就能直接用,不用额外处理格式。

2. 本地模拟/静态数据

测试阶段可以直接构造符合格式的字符串:

// 紧凑格式
const rawData = "0: data: testdata1 1: data: testdata2";
// 换行格式(可读性更好)
const rawData = `0: data: testdata1
1: data: testdata2`;

二、在Next.js组件里解析并渲染

拿到原始字符串后,解析成可展示的结构,分两种组件类型:

客户端组件(App Router)

适合需要交互的场景,用useEffect请求数据:

"use client";

import { useState, useEffect } from "react";

export default function PromptDataDisplay() {
  const [dataList, setDataList] = useState([]);
  const [rawData, setRawData] = useState("");

  useEffect(() => {
    const getPromptData = async () => {
      // 替换成真实的API请求,比如调用OpenAI的API
      const response = await fetch("/api/get-prompt-data");
      const fetchedRawData = await response.text();
      setRawData(fetchedRawData);
      
      // 解析数据:按「数字:」分割条目,提取内容
      const parsedList = fetchedRawData.split(/\s+(?=\d+:)/).map(item => {
        const contentMatch = item.match(/\d+: data: (.+)/);
        return contentMatch ? contentMatch[1] : null;
      }).filter(Boolean);
      
      setDataList(parsedList);
    };

    getPromptData();
  }, []);

  return (
    <div className="p-4">
      <h3>Prompt返回的数据</h3>
      <ul className="mt-2 list-disc pl-6">
        {dataList.map((item, idx) => (
          <li key={idx}>{item}</li>
        ))}
      </ul>
      {/* 可选:展示原始格式 */}
      <div className="mt-4 p-3 bg-gray-50 rounded">
        <h4>原始格式预览</h4>
        <pre className="text-sm">{rawData}</pre>
      </div>
    </div>
  );
}

服务器组件(App Router)

适合SEO友好的静态内容,直接异步获取数据:

// 服务器端请求数据的函数
async function fetchPromptData() {
  // 这里可以直接调用AI接口(服务器端调用更安全,不用暴露API密钥)
  const rawData = "0: data: testdata1 1: data: testdata2";
  
  // 解析逻辑和客户端一致
  return rawData.split(/\s+(?=\d+:)/).map(item => {
    const contentMatch = item.match(/\d+: data: (.+)/);
    return contentMatch ? contentMatch[1] : null;
  }).filter(Boolean);
}

export default async function ServerSideDataDisplay() {
  const dataList = await fetchPromptData();

  return (
    <div className="p-4">
      <h3>服务器端获取的Prompt数据</h3>
      <ul className="mt-2 list-disc pl-6">
        {dataList.map((item, idx) => (
          <li key={idx}>{item}</li>
        ))}
      </ul>
    </div>
  );
}

三、避坑提醒

  • Prompt要绝对明确:AI很容易跑题,一定要强调「严格按格式返回,不要加任何解释」,甚至可以加一句「不符合格式的回答无效」。
  • 解析逻辑要容错:如果返回的字符串有换行、多余空格,用正则/\s+(?=\d+:)/分割比单纯按空格分割更靠谱,确保每个条目都是以数字索引开头。
  • API密钥要藏好:如果调用AI接口,一定要在Next.js的API路由里处理,不要在客户端直接暴露密钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:55:15