如何从 Nest.js 提供资产并添加中间件以检测图像请求
Posted
技术标签:
【中文标题】如何从 Nest.js 提供资产并添加中间件以检测图像请求【英文标题】:how to serve assets from Nest.js and add middleware to detect image request 【发布时间】:2018-12-05 08:35:06 【问题描述】:我正在尝试从 Nest.js 服务器提供图像并添加中间件来跟踪所有请求,但我可以让它工作的唯一方法是使用 express
import NestFactory from '@nestjs/core';
import * as bodyParser from "body-parser";
import AppModule from "./app.module";
import * as path from "path";
import * as express from 'express';
async function bootstrap()
const app = await NestFactory.create(AppModule);
app.use(bodyParser.json(limit: '50mb'));
app.use(function(req, res, next)
next();
);
//
app.use('/api/track/',express.static(path.join(__dirname, '/public'))); //Serves resources from public folder
app.use('/api/track/:img', function (req, res, next)
console.log('do something');
next();
);
await app.listen(3333);
bootstrap();
如何使用控制器或中间件来实现它?
【问题讨论】:
【参考方案1】:The nestjs doc tells you, how to serve static files. 简而言之,您可以这样做:
在 main.ts 中指定资产的根目录
app.useStaticAssets(path.join(__dirname, '/../public'));
使用@Res注解可以使用express框架的sendFile方法
@Get('track/:imgId')
test(@Param('imgId') imgId, @Res() res)
const imgPath = getImgPath(imgId);
return res.sendFile(imgPath, root: 'public' );
此解决方案假定您的 nestjs 安装在后台使用 express。
来源:
https://github.com/nestjs/nest/issues/402 https://docs.nestjs.com/techniques/mvc想在此处加点,请确认您使用的是:
const app = await NestFactory.create<NestExpressApplication>(AppModule);
而不是这个:
const app = await NestFactory.create(AppModule);
在您的 main.ts
文件中。
【讨论】:
getImgPath 来自哪里? @DiegoSarmiento 例如您将图像的路径(或链接)存储在数据库中,getImgPath 通过 imgId 检索该路径。【参考方案2】:它对我有用。只需将此控制器注入应用模块即可。
import Controller, Get, Req, Res from '@nestjs/common';
@Controller('uploads')
export class ServeFilesController
@Get('products/images/:imageName')
invoke(@Req() req, @Res() res)
return res.sendFile(req.path, root: './' );
【讨论】:
以上是关于如何从 Nest.js 提供资产并添加中间件以检测图像请求的主要内容,如果未能解决你的问题,请参考以下文章