开发Excel任务窗格插件调用OpenAI API遇chat属性未定义错误
解决"Cannot read properties of undefined (reading 'chat')"错误
核心原因分析
错误说明openai对象未被正确初始化,导致chat属性不存在。结合Excel任务窗格的Web运行环境,主要原因有两个:
- 浏览器环境无法识别
process.env,导致API密钥未正确传入OpenAI实例 - 可能使用了不适合浏览器环境的导入方式
具体修复步骤
1. 替换环境变量的使用方式
Excel任务窗格运行在浏览器中,没有Node.js的process对象,不能通过process.env.OPENAI_API_KEY获取密钥。可以通过以下两种方式处理:
- 开发测试(不推荐生产):直接传入API密钥(注意:生产环境绝对不能硬编码密钥,需通过后端代理)
- 生产环境:搭建后端服务,插件通过调用后端接口间接请求OpenAI API,避免密钥暴露
2. 调整SDK导入与初始化代码
如果是浏览器环境,使用ES模块导入方式,确保OpenAI实例正确初始化:
// 替换require为ES模块导入 import OpenAI from "openai"; // 初始化OpenAI实例,这里示例用直接传入密钥(开发测试用) const openai = new OpenAI({ apiKey: "你的API密钥", // 生产环境请替换为后端代理方式 dangerouslyAllowBrowser: true // 仅开发测试时使用,生产环境必须禁用 });
3. 修正返回值处理逻辑
OpenAI v4 SDK的返回值结构中,completion直接包含choices,不需要completion.data,原代码的这部分判断会导致后续报错,需要修正:
async function sendToGPT(formula) { try { const completion = await openai.chat.completions.create({ messages: [ { role: "system", content: "You are an assistant." }, { role: "user", content: `Explain the following excel formula ${formula}.` } ], model: "gpt-3.5-turbo", }); // 修正返回值判断逻辑 if (completion.choices && completion.choices.length > 0) { const responseText = completion.choices[0].message.content; console.log(responseText); displayGPTResponse(responseText); } else { console.log('No completion found.'); displayGPTResponse('No completion found.'); } } catch (error) { console.error('Error sending data to GPT:', error); displayGPTResponse(`Error: ${error.message}`); } }
4. 生产环境安全建议
绝对不要在前端代码中直接暴露OpenAI API密钥,否则会被恶意窃取。正确的做法是:
- 搭建一个后端接口,由后端处理OpenAI API请求
- Excel插件通过
fetch或Axios调用后端接口,传入需要处理的公式,后端返回GPT的响应
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

