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){
  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');

  await app.listen(3333);


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


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

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.


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.

Answered By – Upvote

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published