Estoy tratando de servir una imagen desde el servidor Nest.js y agregar un middleware para rastrear todas las solicitudes, pero la única forma en que pude hacerlo funcionar fue con 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();¿Cómo puedo implementarlo usando el controlador o el middleware?
El documento de nestjs le dice cómo servir archivos estáticos. En resumen, así es como lo haces:
Especifique el directorio raíz de sus activos en su main.ts
app.useStaticAssets(path.join(__dirname, '/../public'));Use la anotación @Res para poder usar el método sendFile de express framework
@Get('track/:imgId') test(@Param('imgId') imgId, @Res() res) { const imgPath = getImgPath(imgId); return res.sendFile(imgPath, { root: 'public' }); }Esta solución asume que su instalación de nestjs usa express under the hood.
Fuentes:
Si desea agregar un punto aquí, asegúrese de estar usando:
const app = await NestFactory.create<NestExpressApplication>(AppModule);En lugar de esto:
const app = await NestFactory.create(AppModule); en su archivo main.ts
Funcionó para mí. Simplemente inyecte este controlador en el módulo de la aplicación.
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: './' }); } }