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

Next.js中API提交数据后无法获取数据问题求助

问题原因分析
  • 无数据持久化逻辑:当前/api/uploadNftData接口仅接收POST请求的payload并直接返回,未将数据写入任何持久化存储(如文件、数据库),请求结束后数据直接丢失。
  • 数据获取方式错误:页面获取数据时使用POST请求且传递空body,接口仅处理POST请求的接收逻辑,未实现返回存储数据的分支;同时,获取数据的标准HTTP方法应为GET,而非POST。
  • API无状态特性限制:Next.js的API路由是无状态的,每次请求都会创建新的函数实例,即使在API内用变量临时存储数据,下一次请求也会重置丢失。
解决方案

1. 修改API接口,实现数据持久化与GET查询逻辑

以下以本地JSON文件作为简易持久化存储(生产环境建议使用MongoDB、PostgreSQL等数据库):

const { log } = console;
const fs = require('fs');
const path = require('path');

// 定义数据存储文件路径
const dataFilePath = path.join(process.cwd(), 'data', 'nftData.json');

// 确保存储目录存在
const ensureDir = () => {
  const dir = path.dirname(dataFilePath);
  if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir, { recursive: true });
  }
};

// 读取存储的数据
const readData = () => {
  ensureDir();
  if (!fs.existsSync(dataFilePath)) {
    return {};
  }
  const rawData = fs.readFileSync(dataFilePath);
  return JSON.parse(rawData);
};

// 写入数据到文件
const writeData = (data) => {
  ensureDir();
  fs.writeFileSync(dataFilePath, JSON.stringify(data, null, 2));
};

export default function uploadNftData(req, res) {
  if (req.method === "POST") {
    const nftData = req.body;
    log("Req payload", nftData);
    // 将数据写入持久化存储
    writeData(nftData);
    res.status(200).json({ success: true, data: nftData });
  } else if (req.method === "GET") {
    // 读取存储的数据并返回
    const storedData = readData();
    res.status(200).json(storedData);
  } else {
    res.status(405).json({ msg: "Method not allowed" });
  }
}

2. 修改数据获取页面,使用GET请求获取数据

import { useState, useEffect } from 'react';
import Main from '../components/Main';
import Templatepage from '../components/Templatepage';
import TemplateHeader from '../components/TemplateHeader';
import Herosec from '../components/Herosec';
import Box from '@mui/material/Box';

function page() {
  const [data, setData] = useState(null);
  const [isLoading, setLoading] = useState(false);

  useEffect(() => {
    setLoading(true);
    fetch("/api/uploadNftData", {
      method: "GET",
      headers: {
        "Content-Type": "application/json",
      },
    })
      .then((res) => res.json())
      .then((storedData) => {
        setData(storedData);
        setLoading(false);
      })
      .catch((error) => {
        console.error("Fetch error:", error);
        setLoading(false);
      });
  }, []);

  if (isLoading) return <p>Loading...</p>;
  if (!data || Object.keys(data).length === 0) return <p>No profile data</p>;

  return (
    <>
      <Main>
        <Templatepage>
          <TemplateHeader />
          <Herosec>
            marketplace
            <Box
              sx={{
                background: "#000",
                height: "200px",
                width: "200px",
                margin: "80px",
              }}
            >
              <h1 style={{ color: "#fff" }}>{data.addStory}</h1>
              <p style={{ color: "#fff" }}>{data.selectedVideoUrl}</p>
            </Box>
          </Herosec>
        </Templatepage>
      </Main>
    </>
  );
}

export default page;

3. 注意事项

  • 本地JSON文件存储仅适合开发测试,生产环境需改用数据库,避免并发写入冲突。
  • 若需存储多条NFT数据,可将存储结构改为数组,POST时追加数据,GET时返回整个数组。
  • 部署到Vercel等平台时,本地文件存储不可用,需改用云数据库或云存储服务。

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

相关产品推荐
方舟 Agent Plan

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

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