You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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 || '发送邮件时出现未知错误' 
      } 
    }
  })
}

关键注意点

  1. 不要返回带循环结构的对象FormData、原生Response、部分Error实例都不能直接作为返回值,必须转成字符串、普通JSON对象再返回。
  2. 先解决序列化问题,再看预期错误:现在这个循环结构错误是前置报错,挡住了后续的URL/密钥校验,修正后就能正常看到你预期的「无效URL/密钥」提示了。
  3. 日志输出也要注意:如果在代码里用console.log打印FormDataResponse,有些Sandbox环境也会自动序列化日志内容,同样可能触发这个错误,建议只打印字符串或普通对象。

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

火山引擎 最新活动