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
相关产品推荐
相关产品推荐

