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