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

Node.js报UnhandledPromiseRejectionWarning 脸书聊天机器人TTS消息偶发丢失如何修复

修复后完整可运行代码
const axios = require("axios");
const fs = require("fs-extra");
const path = require("path");

module.exports.config = {
  name: "sayv2",
  version: "1.0.2",
  hasPermssion: 0,
  credits: "NTKhang",
  description: "sing <nội dung>",
  commandCategory: "audio",
  usages: "sing <nội dung>, (sử dụng api fbvn)",
  cooldowns: 1,
};

module.exports.run = async ({ event, api, args }) => {
  // 输入合法性校验
  const text = args.join(" ").trim();
  if (!text) {
    return api.sendMessage("请输入需要转换为语音的文字内容", event.threadID, event.messageID);
  }

  // 生成唯一临时文件路径,避免并发读写冲突
  const tempFilePath = path.join(__dirname, "cache", `${Date.now()}-${Math.random().toString(36).slice(2)}-tts.mp3`);

  try {
    // 请求TTS接口
    const apiRes = await axios.get(encodeURI(`https://fbvn.online/API/?apicualeanhtruong=${text}`));
    let responseData = apiRes.data;
    
    // 处理接口返回的特殊后缀
    if (typeof responseData === "string" && responseData.endsWith("1")) {
      responseData = responseData.slice(0, -1);
    }

    // 解析返回JSON
    const ttsInfo = JSON.parse(responseData);
    if (!ttsInfo.async) {
      throw new Error("TTS接口返回异常,无音频地址");
    }

    // 下载音频文件
    const audioRes = await axios.get(ttsInfo.async, { responseType: "arraybuffer" });
    // 写入临时文件
    await fs.writeFile(tempFilePath, Buffer.from(audioRes.data));

    // 发送语音消息
    await api.sendMessage(
      { attachment: fs.createReadStream(tempFilePath) },
      event.threadID,
      // 发送完成删除临时文件
      async () => await fs.unlink(tempFilePath).catch(() => {}),
      event.messageID
    );
  } catch (err) {
    // 统一捕获所有异常,避免抛出未处理的Promise拒绝
    console.error("TTS功能错误:", err);
    api.sendMessage("语音生成失败,请稍后重试", event.threadID, event.messageID);
    // 出错时也清理临时文件
    await fs.unlink(tempFilePath).catch(() => {});
  }
};
核心修复点说明
  • 新增全链路异常捕获:所有异步操作、JSON解析、文件读写逻辑均包裹在try/catch中,彻底解决UnhandledPromiseRejectionWarning报错
  • 新增输入校验:避免空输入触发接口异常
  • 临时文件命名优化:使用随机唯一名称,解决高并发场景下固定文件名导致的读写冲突问题,大幅降低偶发发送失败概率
  • 依赖导入优化:将依赖引入移到模块顶部,避免每次函数执行重复加载依赖
  • 临时文件清理优化:无论执行成功还是失败都会主动清理临时文件,避免残留文件占用存储空间
  • 冷却时间调整:将冷却时间从0改为1秒,避免高频调用触发接口限流

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:15:04