Multer Middleware Usage in Express Routes

Multer works as middleware in Express, meaning it sits between the incoming request and your route handler to process file uploads.

How to use Multer as middleware in Express?

You use Multer directly in your route as middleware.

Example:

const multer = require("multer");
const upload = multer({ dest: "uploads/" });

app.post("/upload", upload.single("file"), (req, res) => {
  res.send("File uploaded");
});

Here, upload.single("file") acts as middleware.

Where to place Multer in route handling?

Multer should be placed:

Structure:

app.post(
  "/upload",
  upload.single("file"), // Multer middleware
  (req, res) => {
    res.send("Done");
  }
);

This ensures Multer processes the request before your logic runs.

Can Multer be used globally or per route?

Per-route (recommended):

app.post("/upload", upload.single("file"), handler);

Globally (not recommended for file uploads):

app.use(upload.single("file"));

How to chain Multer with other middleware?

Multer can be combined with other middleware like authentication or validation.

Example:

const authMiddleware = (req, res, next) => {
  console.log("User authenticated");
  next();
};

app.post(
  "/upload",
  authMiddleware,
  upload.single("file"),
  (req, res) => {
    res.send("File uploaded with auth");
  }
);

Order matters:

  1. Auth / validation middleware
  2. Multer (file processing)
  3. Route handler

What happens after Multer processes the request?

After Multer runs:

Then control passes to the next middleware or route handler.

Complete Example

const express = require("express");
const multer = require("multer");

const app = express();

const upload = multer({ dest: "uploads/" });

const logger = (req, res, next) => {
  console.log("Request received");
  next();
};

app.post(
  "/upload",
  logger,
  upload.single("file"),
  (req, res) => {
    res.json({
      message: "Upload complete",
      file: req.file,
      body: req.body,
    });
  }
);

app.listen(3000, () => {
  console.log("Server running on port 3000");
});

Key Takeaways