ExpressJS调用OpenAI GPT-3 API报循环结构转JSON错误排查
问题原因及解决方案
这个错误是因为你直接把OpenAI返回的完整response对象传给了res.send(),而该对象包含循环引用的属性(比如请求实例、socket连接等),无法被正常序列化为JSON。
修复步骤
- 只提取OpenAI响应中的有效数据部分,也就是
response.data,这才是包含AI生成内容的核心结构。 - 若只需要AI生成的文本结果,可以进一步从
response.data.choices中提取具体内容。
修改后的核心代码:
app.get('/api/v1', async (req, res) => { let body = { model: "text-davinci-003", prompt: "How are you?", temperature: 1, max_tokens: 2086, top_p: 1, frequency_penalty: 0, presence_penalty: 0, }; const response = await openai.createCompletion(body); // 返回有效数据部分 res.send(response.data); // 若仅需AI回答文本,可改为: // res.send({ answer: response.data.choices[0].text.trim() }); });
额外优化建议
- 增加错误捕获:给异步请求添加
try/catch,避免请求失败导致服务器崩溃:
app.get('/api/v1', async (req, res) => { try { let body = { model: "text-davinci-003", prompt: "How are you?", temperature: 1, max_tokens: 2086, top_p: 1, frequency_penalty: 0, presence_penalty: 0, }; const response = await openai.createCompletion(body); res.send(response.data); } catch (error) { res.status(500).send({ error: error.response?.data || error.message }); } });
- 模型替换:
text-davinci-003已被OpenAI弃用,建议改用gpt-3.5-turbo-instruct,参数结构完全兼容。
内容的提问来源于stack exchange,提问作者Chenille 'Shay' Pottle
相关产品推荐
相关产品推荐

