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

使用Express+Google Sheets API向React传数据时res.send返回空对象问题

问题:Express + Google Sheets API 数据传递异常

我正在尝试将Google Sheets API与Express结合使用,本人JavaScript经验有限。我试图从Express向React传递JSON对象,但最终发送对象时,前端显示为空。我尝试过使用res.body/res.data,但对象似乎没有这两个属性。我还尽可能在各处添加await以确保对象加载完成后再发送,但都无济于事。如果直接使用res.json或res.send发送响应对象,会出现“循环结构转换为JSON”的错误。

代码示例

async function docShit() {
  // Initialize the sheet - doc ID is the long id in the sheets URL
  const doc = new GoogleSpreadsheet(
    "--SPREADSHEET ID--"
  );

  // Initialize Auth
  await doc.useServiceAccountAuth({
    client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
    private_key: process.env.GOOGLE_PRIVATE_KEY,
  });

  await doc.loadInfo(); // loads document properties and worksheets

  const sheet = doc.sheetsByTitle[--WORKSHEET TITLE--]; 
  const rows = await sheet.getRows(); // can pass in { limit, offset }

  return rows;
}

app.get("/home", async (req, res) => {
  try {
    await docShit()
      .then((response) => {
        res.send(Promise.resolve(response)); //console log shows the object, but res.send just sends nothing??
      })
      .catch((err) => console.log(err));
  } catch (err) {
    console.error(err.message);
  }
});
解决方案

核心问题分析

  1. sheet.getRows()返回的不是普通JSON对象,而是node-google-spreadsheet库的自定义Row实例,包含循环引用(比如关联的工作表、文档对象),直接序列化会触发JSON转换错误。
  2. 路由代码混用await和.then(),且错误地用Promise.resolve()包裹结果发送,导致Express无法正确处理响应。

修改后的代码

1. 转换Row实例为纯JSON对象

修改docShit()函数,使用库提供的toObject()方法将Row实例转换为无循环引用的普通对象:

async function docShit() {
  const doc = new GoogleSpreadsheet("--SPREADSHEET ID--");

  await doc.useServiceAccountAuth({
    client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
    private_key: process.env.GOOGLE_PRIVATE_KEY,
  });

  await doc.loadInfo();
  const sheet = doc.sheetsByTitle["--WORKSHEET TITLE--"]; 
  const rows = await sheet.getRows();

  // 将每个Row实例转换为纯数据对象
  return rows.map(row => row.toObject());
}

2. 简化路由处理逻辑

使用纯await语法处理异步操作,用res.json()标准方法发送响应:

app.get("/home", async (req, res) => {
  try {
    const sheetData = await docShit();
    res.json(sheetData); // 自动处理JSON序列化,设置正确响应头
  } catch (err) {
    console.error(err.message);
    // 错误时返回500状态码和错误信息,方便前端排查
    res.status(500).json({ error: "Failed to fetch sheet data", details: err.message });
  }
});

前端接收说明

前端请求/home接口时,直接取响应的JSON数据即可(比如用fetch的response.json(),或Axios的res.data),不需要找res.body。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:20:24