You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js调用OpenAI DALL-E 2 API遭拒后崩溃,求错误处理方案

问题分析与解决方案

为什么你的try-catch/response.catch没生效?

  1. 异步错误未被正确包裹:如果代码用了回调式API,try-catch只能捕获同步错误,回调内的异步错误抓不到;如果是Promise API,但没把所有异步操作纳入try块,或是链式调用的catch没衔接完整,就会出现未捕获的Promise拒绝,直接终止Node进程。
  2. 错误结构解析错误:OpenAI API返回的拒绝错误是层级结构的,若没正确解析error.response.data.error.message,可能误以为没捕获到错误,实际是没拿到正确的错误信息。

正确的错误处理写法

1. Promise链式调用+完整catch

用官方SDK的Promise风格调用,确保在链式末尾添加catch,解析正确的错误字段:

const { OpenAI } = require('openai');
const openai = new OpenAI({ apiKey: '你的API密钥' });

openai.images.generate({
  prompt: '用户输入的提示词',
  n: 1,
  size: '1024x1024'
})
.then(res => {
  // 正常生成图片的处理逻辑
  console.log(res.data);
})
.catch(err => {
  // 捕获所有API错误,包括违禁内容拒绝
  if (err.response) {
    // 打印API返回的具体拒绝原因
    console.error('请求被拒绝:', err.response.data.error.message);
  } else {
    console.error('请求出错:', err.message);
  }
  // 此处不要throw err,否则进程会退出
});

2. async/await配合try-catch

如果使用async函数,必须把await调用放在try块内,同时确保函数调用后的错误也被处理:

const { OpenAI } = require('openai');
const openai = new OpenAI({ apiKey: '你的API密钥' });

async function generateImage(prompt) {
  try {
    const res = await openai.images.generate({
      prompt,
      n: 1,
      size: '1024x1024'
    });
    console.log(res.data);
  } catch (err) {
    if (err.response) {
      console.error('请求被拒绝:', err.response.data.error.message);
    } else {
      console.error('请求出错:', err.message);
    }
    // 不重新抛出错误,避免进程终止
  }
}

// 调用函数,顶层调用要加catch防止漏错
generateImage('用户输入的提示词').catch(err => console.error('全局兜底:', err));

注意:Node.js顶层await需要开启ES模块(在package.json里设置"type": "module"),否则要把代码放进async函数里执行。

3. 全局兜底防止进程退出

如果仍有未捕获的Promise拒绝,添加全局监听:

process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise错误:', reason);
  if (reason.response) {
    console.error('API拒绝原因:', reason.response.data.error.message);
  }
  // 此处不抛出错误,进程就不会直接退出
});

关键提醒

  • 确认OpenAI SDK版本:v4版本的错误结构是err.response.data,旧版本可能是err.data,若用旧版需调整错误解析路径。
  • 不要在catch块里重新抛出错误,否则进程仍会终止。
  • 如果使用Express等框架,要在路由里用错误中间件兜底,比如:
app.use((err, req, res, next) => {
  if (err.response?.data?.error?.message) {
    res.status(403).send(err.response.data.error.message);
  } else {
    res.status(500).send('服务器出错');
  }
});

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:15:37