Node.js集成OpenAI API遇401错误及Promise未处理问题求助
问题分析与修复方案
1. 401错误原因及解决
401表示身份认证失败,核心问题出在OpenAI API密钥配置上:
- 检查环境变量
OPENAI_API_KEY:确认变量名无拼写错误,密钥值是从OpenAI后台复制的完整字符串(无多余空格、换行)。 - 验证密钥有效性:登录OpenAI平台确认密钥处于活跃状态,未被禁用或过期。
- 确保环境变量加载:如果使用
dotenv,需在文件开头添加require('dotenv').config(),保证环境变量能被正确读取。
2. 程序崩溃原因:未处理Promise拒绝
你的代码中调用openai.createCompletion时未做错误捕获,一旦API调用失败,会抛出未处理的Promise拒绝,直接导致程序崩溃。需将所有异步操作(OpenAI请求、数据库保存)放入统一的try/catch块中处理。
3. 修复后的完整代码
const { Configuration, OpenAIApi } = require("openai"); require('dotenv').config(); // 确保加载环境变量 // 创建用户数据接口 const createUserData = async (req, res) => { try { const { id, scores, transcript } = req.body; const user_id = req.user._id; console.log(user_id); // 初始化OpenAI配置 const configuration = new Configuration({ apiKey: process.env.OPENAI_API_KEY, }); const openai = new OpenAIApi(configuration); // 调用OpenAI API获取反馈 const openaiResponse = await openai.createCompletion({ model: "text-davinci-002", prompt: `Provide personal feedback for me and give me tips: ${transcript}`, temperature: 0.7, max_tokens: 256, top_p: 1, frequency_penalty: 0, presence_penalty: 0, }); // 打印API返回的实际文本内容 console.log(openaiResponse.data.choices[0].text.trim()); // 创建用户数据并保存到数据库 const newUserData = new UserData({ id: id, scores: scores, transcript: transcript, user_id: user_id }); await newUserData.save(); console.log('POST:', newUserData); return res.status(201).json({ user_data: newUserData }); } catch (error) { // 统一捕获并处理所有错误 console.error('Error:', error.message); // 根据错误类型返回对应状态码和提示 if (error.response?.status === 401) { return res.status(401).json({ error: "OpenAI API密钥无效或未配置" }); } return res.status(500).json({ error: error.message }); } };
额外优化建议
- 输入校验:处理请求前先检查
transcript是否存在,避免空字符串调用OpenAI API。 - 模型升级:
text-davinci-002为旧模型,建议替换为gpt-3.5-turbo-instruct,性能更优。 - 错误细分:在catch块中区分OpenAI错误、数据库错误,返回更精准的前端提示。
内容的提问来源于stack exchange,提问作者Soccerball123
相关产品推荐
相关产品推荐

