提问者:小点点

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


我必须实现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

当我将它传递给辅助线程时,问题就出现了:由于它使用结构化克隆算法来克隆它并作为辅助数据传递,因此这个文件.stream未定义获取到辅助线程中。 我还尝试直接传递file.stream参数,但是由于上面同样的原因,我收到了datacloneerror问题,因为我传递的是FILESTREAM。

对如何解决这个问题有什么建议吗? 我尝试了几种方法来绕过它,其中一种方法是将流写入arraybuffer中,然后使用工作线程中的另一个流来读取它,但老实说,我知道是否有更好的方法来解决它。

谢谢


共1个答案

匿名用户

    recorder.ondataavailable = function(data){
      //cp data arr, push to hold , socket.io to googleStreamRecognize
      var newcp = data.slice(0);
      holdAudio.push(newcp);
      socket.emit('binaryData', data.buffer);
    }; //end of dataAvail CB
  } //end init

接收以上Bindata:

    client.on('binaryData', function (data) {
         //console.log('data ' +data.length); //log binary data
        if (recognizeStream !== null) {
          //console.log('toSTRM')
            recognizeStream.write(data);
        }
    });
// using an api that obscures detail but its just dumping binary ( arrayData ) to a stream 
    function startRecognitionStream(client, data) {
        recognizeStream = speechClient.streamingRecognize(request)
            .on('error', console.error)
            .on('data', (data) => {
                client.emit('speechData', data);

                if (data.results[0] && data.results[0].isFinal) {
                    stopRecognitionStream();
                    //startRecognitionStream(client);
                    // console.log('restarted stream serverside');
                }
            });
    }

相关问题