socket.io-stream将文件写入光盘,然后完成后发出文件path

当我从客户端发送文件到服务器时,我有一个使用socket.io-stream的问题。 我将文件path推送到mongodb,然后将文件保存到文件文件夹。 问题是,当光盘写入文件时,文件path在写入完成之前返回给客户端,然后img元素paht正确,但图像不在页面上呈现。

下面的代码按照预期工作,但手动等待100毫秒,然后返回到客户端的path。 如果图像太大,这100毫秒将不会保证。 任何其他解决scheme

服务器端:

 ss(socket).on('fileUpload', function(stream, data) { Chat.findByIdAndUpdate(data.roomId, { $push: { "messages": { author: data.author, date: Date.now(), isFile: true, extension: data.extension } } },{safe: true, new: true, upsert: true}, (err, message) => { if(err){ console.log(err); } let msg = message.messages[message.messages.length - 1]; let filename = path.join(__dirname, 'public/files' , `${msg._id}.${msg.extension}`); stream.pipe(fs.createWriteStream(filename)); setTimeout(() => { io.sockets.to(data.roomId).emit('chat-connection', msg); },100); }); }); 

客户端:

 function fileUpload(file) { let fileExtension = file.name.split('.').pop(); let stream = ss.createStream(); // upload a file to the server. ss(vm.socket).emit('fileUpload', stream, { size: file.size, extension: fileExtension, roomId:vm.chatInstance._id, author:$scope.user.fullName, }); ss.createBlobReadStream(file).pipe(stream); } 

您可以检查您正在写入的stream上的结束事件。

 stream.on('finish', () => { io.sockets.to(data.roomId).emit('chat-connection', msg); }); stream.pipe(fs.createWriteStream(filename));