我如何从可写节点流中获取文件?
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,它还为您提供选项,例如该图像的宽度和高度/细节列在文档中。
我在做什么 所以我试图用二维码回复命令交互,我不想将文件保存到机器人的目录,然后以这种方式发送,相反,我有二维码文本,我我正在使用二维码包将其转换为二维码,现在我正在尝试将文件写入节点流。
问题是什么
问题是我不知道如何访问该文件,因为当我尝试使用 { 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,它还为您提供选项,例如该图像的宽度和高度/细节列在文档中。