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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:50:26