Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to serve assets from Nest.js and add middleware to detect image request

I am trying to serve image from Nest.js server and add middleware to track all request but the only way I could make it work was with 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();

How can I implement it with using the controller or middleware?

like image 561
user8987378 Avatar asked Jun 26 '18 15:06

user8987378


1 Answers

The nestjs doc tells you, how to serve static files. In short, here is how you do it:

Specify root directory of your assets in you main.ts

app.useStaticAssets(path.join(__dirname, '/../public'));

Use the @Res annotation to be able to use the sendFile method of express framework

@Get('track/:imgId')
test(@Param('imgId') imgId, @Res() res) {
  const imgPath = getImgPath(imgId);
  return res.sendFile(imgPath, { root: 'public' });
}

This solution assumes that your nestjs installation uses express under the hood.


Sources:

  • https://github.com/nestjs/nest/issues/402
  • https://docs.nestjs.com/techniques/mvc

Want to add a point here, please make sure you're using:

const app = await NestFactory.create<NestExpressApplication>(AppModule);

Instead of this:

const app = await NestFactory.create(AppModule);

in your main.ts file.

like image 154
UpCat Avatar answered Sep 28 '22 07:09

UpCat