我如何从可写节点流中获取文件?

How do i get a file from a writable node stream?

我在做什么 所以我试图用二维码回复命令交互,我不想将文件保存到机器人的目录,然后以这种方式发送,相反,我有二维码文本,我我正在使用二维码包将其转换为二维码,现在我正在尝试将文件写入节点流。

问题是什么 问题是我不知道如何访问该文件,因为当我尝试使用 { files: [returned.qrcode] } 它不会发送图像附件。

更多信息 它是一个可写流,不知道如何从流中获取文件,它 returns 一个普通的可写流

代码

获取二维码并写入流的代码

        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 })

        let data
        const filestream = new Stream.Writable()
        qrcode.toFileStream(filestream, temp_secret.otpauth_url)

        const readableStream = new Stream.Readable()
        readableStream.push(null)
        readableStream.pipe(filestream)

        filestream.end()

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

命令代码(我尝试发送附件的部分)

        await interaction.deferReply({ ephemeral: true })
        const result = await handler.register2FA(interaction.user)
        console.log(result) // logs a stream, its not undefined
        await interaction.editReply({ content: "Scan this qr code", ephemeral: true, files: [result.qrcode]})

记录的流:

Readable {
  _readableState: ReadableState {
    objectMode: false,
    highWaterMark: 16384,
    buffer: BufferList { head: null, tail: null, length: 0 },
    length: 0,
    pipes: [ [Writable] ],
    flowing: true,
    ended: true,
    endEmitted: false,
    reading: false,
    constructed: true,
    sync: true,
    needReadable: false,
    emittedReadable: true,
    readableListening: false,
    resumeScheduled: true,
    errorEmitted: false,
    emitClose: true,
    autoDestroy: true,
    destroyed: false,
    errored: null,
    closed: false,
    closeEmitted: false,
    defaultEncoding: 'utf8',
    awaitDrainWriters: null,
    multiAwaitDrain: false,
    readingMore: false,
    decoder: null,
    encoding: null,
    [Symbol(kPaused)]: false
  },
  _events: [Object: null prototype] {
    end: [Function: bound onceWrapper] { listener: [Function: onend] },
    data: [Function: ondata]
  },
  _eventsCount: 2,
  _maxListeners: undefined,
  [Symbol(kCapture)]: false
}

首先,像这样转换您的流:

async function createStream() { 
const stream = new Transform({
      transform(chunk, encoding, callback) {
        this.push(chunk)
        callback()
      }
    })
 await qrcode.toFileStream(filestream, temp_secret.otpauth_url)
}
return stream;

可用于 discord.js 的 MessageAttachment 构造函数接受可写流,您可以使用如下构造函数将流转换为 .png


    const {
        MessageAttachment
    } = require("discord.js");
    let qrcode = createStream();
    const x = new MessageAttachment(qrcode, 'QRCode.png') // further attach it like so:
    await interaction.editReply({
        content: "Skeniraj ovaj qr code dole.",
        ephemeral: true,
        files: [x]
    }) 

Constructor 接受以下三个参数,其中附件是您的可写流,名称是您的文件名,数据是 APIAttachment object,它还为您提供选项,例如该图像的宽度和高度/细节列在文档中。