GraphCool出现TypeError循环结构转JSON错误,复制官方示例遇Webpack/Sandbox问题
解决GraphCool中「Converting circular structure to JSON」的TypeError错误
嘿,我之前也踩过这个坑,来给你拆解下问题和解决办法~
你遇到的这个循环结构转JSON的错误,本质是GraphCool的函数运行环境会自动把你的函数返回值序列化成JSON,但你代码里的FormData对象(或者某些原生响应/错误对象)内部带有循环引用的结构——比如对象A里引用了对象B,对象B又反过来引用A,JSON序列化器碰到这种情况就会直接报错,反而把你预期的「无效URL/密钥」错误给掩盖了。
核心问题分析
你复制的官方示例里用了FormData,大概率是没注意到:如果直接返回FormData实例、原生Response对象,或者在错误捕获时直接返回Error对象,这些结构里都藏着循环引用,会触发序列化失败。
修正后的代码示例
给你调整下代码,重点处理返回值和错误捕获,避免传递循环结构对象:
const fetch = require('isomorphic-fetch') const Base64 = require('Base64') const FormData = require('form-data') const apiKey = '__MAILGUN_API_KEY__' const url = '__MAILGUN_URL__' export default event => { const form = new FormData() form.append('from', 'Nilan <nilan@graph.cool>') form.append('to', '目标邮箱@example.com') // 补充其他需要的字段(比如subject、text等) return fetch(url, { method: 'POST', headers: { 'Authorization': `Basic ${Base64.encode(`api:${apiKey}`)}` }, body: form }) .then(res => { // 先把响应转成文本/JSON,不要直接返回原生Response对象 return res.text() }) .then(result => { // 返回干净的可序列化对象,让GraphCool能正常处理 return { data: { success: true, message: '邮件发送成功', detail: result } } }) .catch(error => { // 错误处理时不要直接返回Error对象(很多Error带循环引用),只返回错误信息 console.error('邮件发送失败:', error.message) return { error: { message: error.message || '发送邮件时出现未知错误' } } }) }
关键注意点
- 不要返回带循环结构的对象:
FormData、原生Response、部分Error实例都不能直接作为返回值,必须转成字符串、普通JSON对象再返回。 - 先解决序列化问题,再看预期错误:现在这个循环结构错误是前置报错,挡住了后续的URL/密钥校验,修正后就能正常看到你预期的「无效URL/密钥」提示了。
- 日志输出也要注意:如果在代码里用
console.log打印FormData或Response,有些Sandbox环境也会自动序列化日志内容,同样可能触发这个错误,建议只打印字符串或普通对象。
内容的提问来源于stack exchange,提问作者Michal




