我必须实现Multer存储的这种自定义方法,以便在保存文件之前对其进行加密。
我已经实现了我的函数encrypt,它将与一个工作线程通信。
import { Worker, isMainThread } from 'worker_threads'
import path from 'path'
export const encrypt = ({ destination, filename, file, password }) =>
new Promise((resolve, reject) => {
if (isMainThread) {
const workerPath = path.resolve(__dirname, './encryptWorker.js')
const worker = new Worker(workerPath, {
workerData: {
destination,
file,
filename,
password
},
})
worker.on('message', resolve)
worker.on('error', reject)
worker.on('exit', (code) => {
if (code !== 0) {
reject(new Error(`Worker stopped with exit code ${code}`))
}
})
}
})
进入函数的file
参数包含基本信息(名称,长度)以及对其转换至关重要的file.stream
。
当我把它传递给工人线程时,问题就来了:因为它使用structured clone algorithm来克隆它并作为工作者数据传递,所以碰巧这个file.stream
正在将undefined
获取到工作者线程中。我也尝试直接传递file.stream
参数,但是,由于上面同样的原因,我收到了DataCloneError
问题,因为我传递的是FileStream。
对于如何解决这个问题有什么建议吗?我尝试了几种方法来绕过它,其中一种是将流写入ArrayBuffer
,然后在Worker Thread中使用另一个流读取它,但老实说,我知道是否有更好的方法来解决它。
谢谢
1条答案
按热度按时间4sup72z81#
不幸的是,您不能显式地将multer库用于辅助线程。
但你可以解决它。我的方法是让multer在主线程中写入一个临时目录,然后在另一个线程上执行我的繁重工作。
在执行它之前,我将文件从temp目录移动到我想要的位置,并在工作线程中使用
fs.rename
。