文件上传与静态资源访问;
Multer 是官方推荐的文件上传方案。它可以处理以 multipart/form-data 格式发送的数据,主要用于通过 HTTP POST 请求上传文件。
本项目的文件都存储在本地硬盘中,硬盘存储上传文件数据格式为:
在控制器中规定了上传文件将被保存在根目录的uploads文件夹中,并且限制了文件的大小和文件类型,之后通过multer进行文件上传。
上传之后我们就需要访问, 这涉及到了nestjs的静态文件服务, 首先安装包npm install --save @nestjs/serve-static,并app.module.ts中全局导入
使用 BullMQ 实现异步任务;
BullMQ是一个基于 Redis 的任务队列,所以需要部署好redis才能正常使用,这里只注册了一个队列 'export-job'
service把任务加入到队列中等待处理
本项目异步队列工作为把所选文件打包成zip文件并且保存到另一个文件夹中去:
-
首先声明此处为队列'export-job'的处理逻辑
-
指定压缩文件名称并且指定输出路径
-
创建文件写入流,
fs.createWriteStream会生成一个写入流,压缩包的内容将写入这个文件。这个流是archiver压缩包最终输出到磁盘的地方。有了写入流,压缩数据就可以“流水线”式处理,archiver 不用等全部文件都读完再写入,所以压缩过程是异步的。 -
在读取完需要的文件之后开始压缩,当压缩完成、写入磁盘完成时触发
close事件;如果在压缩过程中出现任何错误,就触发reject,Promise 会抛出异常。
使用 EventEmitter 模块实现模块间通信;
当压缩完成时由Producer发布事件
这时notification模块中发出通知,提示谁导出了文件并且下载文件的位置。这里可以看到由于并未登录账号,所以显示的用户为undefined。