如何从 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 提供资产并添加中间件以检测图像请求的主要内容,如果未能解决你的问题,请参考以下文章

Nest.JS 和 Observables

Nest.JS 使用 AuthGuard 作为 GraphQL 的中间件

Nest.js 是如何实现 AOP 架构的?

Nest.js 中的优雅环境处理

如何在 Nest.js 中提供静态 HTML 文件?

Nest.js:如何覆盖导入模块中的提供程序?