用户登录

上传的用户头像我们可以单独设置一个存储位置,比如放在 uploads 下面的 avatar 这个目录里面。在这个 avatar.interceptor 这里,可以设置一下 FileInterceptor 选项参数的 dest 这个属性,它的值就是文件存储的位置。

下面我们尝试另外一种方法,可以把之前创建的这个 AppUploadModule 转换成一个动态模块,让它支持一个参数,导入它的时候可以设置一下上传文件的存储位置。

动态模块

在这个模块类的上面定义并导出一个 interface,名字是 AppUploadModuleOptions,表示模块支持的参数类型,里面添加一个 destination,类型是 string。

然后剪切一下 Module 装饰器里的这些东西,这个模块里面添加一个静态方法,方法的名字可以随便起,一般可以叫做 register,它支持一个 options 参数,类型就是上面定义的这个 AppUploadModuleOptions 。方法返回的东西的类型设置成 DynamicModule。

方法 return 一个对象,对象里面的东西就是一开始剪切的原本在 @Module 装饰器里面的那些东西。除了这些,另外还必须得提供一个 module 属性,它的值是模块的名字,这里就是 AppUploadModule。

在这个方法里解构一下 options 参数,需要 destination,它来自 options。

然后改一下配置 MulterModule 的时候设置成这个 dest,把这个配置换成 destination ,这样在使用 AppUploadModule 的时候可以设置一下 destination,它的值应该是一个配置,配置对应的值就是存储上传的文件用的路径。

另外,如果在这个模块的其它的 provider 里面需要用到模块的 options 参数的值,我们可以把它的值作为一个 provider 提供给其它的 provider 使用。

配置模块

打开 AvatarModule ,这个模块里导入了 AppUploadModule,现在我们可以用一下 register 这个静态方法配置一下这个模块,提供一个对象参数,里面设置一下 destination ,值是一个配置,比如 upload.avatar 。

打开 .env 文件,这里再添加一个环境变量,名字是 UPLOAD_AVATAR,值是 avatar。

打开 app-upload.config ,在文件顶部,先导入 path 这个模块,来自 node 自带的 path。

然后在这个默认导出的方法里面,声明一个 dest,值是 UPLOAD_DEST 这个环境变量的值,下面再声明一个 avatar,它的值是 UPLOAD_AVATAR 这个环境变量的值。

upload 里的 dest 这个配置的值设置成 dest,再添加一个 avatar,值可以用一下 path.join,把 dest 还有 avatar 组合成一个路径。

打开运行项目开发服务的终端,你会发现一个错误,说找不到 join 这个方法。

回到项目,这里我们要修改一个 typescript 的配置,打开 tsconfig.json,在 compilerOptions 这里,把 esModuleInterop 设置成 true。这样控制台就不会再报错了。

测试

在 Http 客户端测试一下,重新发送一下这个上传头像的请求,然后回到项目,打开 uploads 观察一下,现在这个目录的下面有个 avatar,它里面存储的就是上传的用户头像。

将上传模块改为动态模块《 Nest.js 企业级后端实践:用户头像 》

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点