使用basic-ftp上传discord-html-transcripts转录文件失败求助
问题分析
报错TypeError: source.once is not a function的核心原因是:你使用basic-ftp的uploadFrom方法时传入了Buffer,但该方法仅接受本地文件路径字符串或可读流作为第一个参数。内部代码会把传入的source当作流来调用once方法,而Buffer没有这个方法,因此触发报错。
解决方案
推荐两种直接有效的修复方式:
方式1:使用uploadFromBuffer方法(优先选择)
basic-ftp内置了专门处理Buffer上传的uploadFromBuffer方法,替换原有的uploadFrom即可:
修改FTP上传部分的代码:
// 替换原uploadFrom调用,直接使用transcript返回的原始Buffer await clientFtp.uploadFromBuffer( transcriptAttachment.attachment, `/PortalTickets/${transcriptName}` );
注意:你原代码中将transcriptAttachment.attachment转成utf-8字符串再转回Buffer是多余操作——discord-html-transcripts返回的attachment对象的attachment属性本身就是Buffer,直接使用可避免不必要的编码转换问题。
方式2:将Buffer转换为可读流
如果坚持使用uploadFrom,可以把Buffer转换为Node.js可读流:
先引入stream模块:
const { Readable } = require('stream');
再修改上传代码:
await clientFtp.uploadFrom( Readable.from(transcriptAttachment.attachment), `/PortalTickets/${transcriptName}` );
关键代码修改示例
// 创建转录文件 console.log("[Debugging Information] Creating transcript..."); const transcriptAttachment = await ticketTranscript.createTranscript( interaction.channel, { limit: -1, returnType: "attachment", filename: `${transcriptName}`, saveImages: true, footerText: "Central London Roleplay", poweredBy: false, } ); console.log("[Debugging Information] Transcript created:", transcriptAttachment); // 上传至FTP服务器 await clientFtp.uploadFromBuffer( transcriptAttachment.attachment, `/PortalTickets/${transcriptName}` );
内容的提问来源于stack exchange,提问作者Liam Easton
相关产品推荐
相关产品推荐

