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

如何从Node.js可写流中获取文件,无需本地存储即可发送二维码附件

问题根源

你当前的流处理逻辑存在两处核心错误:

  • 自行创建的可读流没有写入任何二维码数据,你调用readableStream.push(null)直接标记流结束,返回的是空流
  • 流的流向完全颠倒:你将空可读流写入了承载二维码的可写流,qrcode库写入可写流的内容并没有向外暴露,discord.js自然读不到有效文件数据

解决方案

方案1:直接用Buffer传递(更简单,推荐)

qrcode库原生支持直接生成Buffer,不需要你自行处理流逻辑,discord.js的文件参数本身兼容Buffer类型,修改代码如下:

const id = uuid.v4();
const temp_secret = speakeasy.generateSecret({
    name: "VikkiVuk (2FA): " + id
});

let newUser = await new factorschema({
    id: id,
    temp_secret: temp_secret.base32,
    secret: "waiting"
}).save()

await schema.updateOne({ userid: user.id }, { uuid: id })

// 直接生成二维码Buffer
const qrBuffer = await qrcode.toBuffer(temp_secret.otpauth_url)

return { userid: id, temp_secret: temp_secret, qrcode: qrBuffer }

发送代码不需要修改,直接传返回的qrcode字段即可。


方案2:用流传递(适合大文件场景)

如果必须用流实现,使用Node.js内置的PassThrough双工流即可,不需要分别创建可读、可写流:

const { PassThrough } = require('stream')

// ...省略其他不变的代码

const qrStream = new PassThrough()
// qrcode往双工流里写内容,同时外部可以从这个流读内容
qrcode.toFileStream(qrStream, temp_secret.otpauth_url)

return { userid: id, temp_secret: temp_secret, qrcode: qrStream }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:39:01