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

