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

如何在Next.js中获取函数输出并渲染到页面?

解决Next.js App Router中从Google Sheets获取数据并传递到页面的问题

问题核心

你使用Next.js App Router(app目录下的page.tsx),但误用了Pages Router的load/GetServerSideProps语法,导致无法将Google Sheets的数据传递到页面替换测试文本'test'。

解决方案步骤

1. 调整文件结构(推荐)

将pages目录下的google_access.tsx移动到app/lib/google_access.ts,避免Pages Router与App Router的文件结构混淆,同时符合App Router的规范。

2. 简化Google Sheets数据获取函数

修改app/lib/google_access.ts,直接返回数据数组而非嵌套的props结构:

import { google } from 'googleapis';

export async function getDataFromGoogleSheet({ row = 1, column = 1 } = {}) {
    try {
        const auth = await google.auth.getClient({ scopes: ['https://www.googleapis.com/auth/spreadsheets.readonly'] });
        const sheets = google.sheets({ version: 'v4', auth });
        const range = `Sheet1!A${row}:C${column}`;
        console.log("Requesting range:" + range);
        const response = await sheets.spreadsheets.values.get({
            spreadsheetId: process.env.SHEET_ID,
            range,
        });

        // 返回数据或空数组,避免报错
        return response.data.values?.[0] || [];
    } catch (error) {
        console.error('Error fetching data from Google Sheet:', error);
        throw new Error('Failed to fetch data from Google Sheet');
    }
}

3. 修改app/page.tsx获取并使用数据

App Router的页面组件默认是Server Component,支持直接在组件函数中用async/await获取数据,无需额外的生命周期或数据获取函数:

import { getDataFromGoogleSheet } from './lib/google_access';

// 组件改为async函数
export default async function Home() {
    // 初始化默认值,避免数据加载失败时页面空白
    let col1 = 'test';
    let col2 = null;
    let col3 = null;

    try {
        // 直接调用异步函数获取数据
        const data = await getDataFromGoogleSheet({ row: 1, column: 1 });
        col1 = data[0] || 'test';
        col2 = data[1] || null;
        col3 = data[2] || null;
    } catch (error) {
        console.error('Error fetching data:', error);
    }

    return (
        <main className="flex min-h-screen flex-col items-center justify-between p-24">
            <div className="z-10 max-w-5xl w-full items-center justify-between font-semibold text-5xl lg:flex">
                <p className="fixed left-0 top-0 flex w-full justify-center border-b border-gray-300 bg-gradient-to-b from-zinc-200 pb-6 pt-8 backdrop-blur-2xl dark:border-neutral-800 dark:bg-zinc-800/30 dark:from-inherit lg:static lg:w-auto  lg:rounded-xl lg:border lg:bg-gray-200 lg:p-4 lg:dark:bg-zinc-800/30">
                    {/* 替换测试文本为获取到的col1 */}
                    {col1}, Sand, Lime&nbsp;
                </p>
                {/* 其余原有代码保持不变 */}
            </div>

            {/* 其余原有代码保持不变 */}
        </main>
    )
}

关键注意点

  • App Router不支持Pages Router的GetServerSideProps、getStaticProps或自定义load函数,Server Component可直接在组件内部处理异步数据获取。
  • 如果需要客户端交互(如动态刷新数据),可将交互部分标记为'use client',并使用useEffect或数据请求库实现,但静态页面初始化获取数据用Server Component更高效。
  • 确保Vercel中已正确配置SHEET_ID环境变量,且Google Cloud服务账号拥有目标表格的只读权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:28:09