Next.js -如何返回JSON而不是HTML预渲染页面

2skhul33  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(192)

首先,我需要说,我是Next.js的新手。我相信这是一个简单的问题,但也许我采取了错误的方法。如果是的话,请告诉我。我已经在谷歌上搜索了一些东西,但没有任何东西能给我提供一个有效的解决方案。
我有一个页面,显示一些基本数据。该页面可以在URL /markets/[market]下找到。
在这个页面中,我想用 AJAX 请求加载一些关于这个市场的最新信息。这是本页的代码:

import useSWR from "swr";
import { useRouter } from "next/router";
import { useState, useEffect } from 'react';

const fetcher = (url) => fetch(url).then((res) => res.json());

export default function Market(props) {
    const router = useRouter();
    const [market,setMarket] = useState(null);

    useEffect(() => {
        if(props.market) {
            setMarket(JSON.parse(props.market));
            console.log(JSON.parse(props.market));
        }
    },[props]);

    
    const { data, error } = useSWR(
        '/markets/data/' + router.query.market,
        fetcher
    );

    if (error) {
        console.log(error);
        return <div>Failed to load.</div>;
    }
    if (!data) return <div>Loading...</div>;

    return (
        <div>
            ...
        </div>
    )
}

如您所见,数据是从/markets/data/[market]中获取的。我已经管理,该页面没有应用默认布局.因此输出为json

但输出看起来像JSON格式,但由于服务器预渲染而为HTML

如何将输出切换为JSON而不是HTML?
为了完整起见,这里是页面/markets/data/[market]的代码。

import dynamic from 'next/dynamic';
import { useRouter } from "next/router";
import { useState, useEffect } from 'react';

export default function MarketData(props) {
    const router = useRouter();
    const [prices, setPrices] = useState(null);

    useEffect(() => {
        if(props.prices) {
            setPrices(JSON.parse(props.prices));
            console.log(JSON.parse(props.prices));
        }
    },[props]);

  return JSON.stringify({
    market: {
        name: router.query.market,
        prices: props.prices
    }
  });
}

export async function getServerSideProps(context) {
    // fetch some stuff and return it
    return {
        props: { 
            prices: JSON.stringify(got),
        }
    };
}
s6fujrry

s6fujrry1#

这是我的问题的解决方案:

export default function MarketData(props) {
    return (
        <></>
    )
}

export const getServerSideProps = async ({ req, res, resolvedUrl }) => {
    ...
    res.setHeader("Content-Type", "application/json");
    res.write('{\"market\": "' + market + '", "prices": ' + JSON.stringify(got) + '}');
    res.end();
    return {
        props: {},
    };
}

将内容类型设置为application/json并返回带有write的数据。

**重要提示:**即使在函数的末尾没有到达该代码,也需要返回一个Javascript对象!

相关问题