使用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); } });
解决方案
核心问题分析
sheet.getRows()返回的不是普通JSON对象,而是node-google-spreadsheet库的自定义Row实例,包含循环引用(比如关联的工作表、文档对象),直接序列化会触发JSON转换错误。- 路由代码混用
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
相关产品推荐
相关产品推荐

