将我的流传递给工作线程node.js

5sxhfpxr  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(117)

我必须实现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中使用另一个流读取它,但老实说,我知道是否有更好的方法来解决它。
谢谢

4sup72z8

4sup72z81#

不幸的是,您不能显式地将multer库用于辅助线程。
但你可以解决它。我的方法是让multer在主线程中写入一个临时目录,然后在另一个线程上执行我的繁重工作。
在执行它之前,我将文件从temp目录移动到我想要的位置,并在工作线程中使用fs.rename

相关问题