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:
- After the route path
- Before your controller/handler function
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);
- Better control
- Only applies to specific routes
Globally (not recommended for file uploads):
app.use(upload.single("file"));
- Applies to all routes
- Can cause unexpected behavior
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:
- Auth / validation middleware
- Multer (file processing)
- Route handler
What happens after Multer processes the request?
After Multer runs:
-
File is stored (disk or memory)
-
File info is available in:
req.file(single)req.files(multiple)
-
Text fields are available in
req.body
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
- Multer is used as route-level middleware
- Always place it before the handler
- Avoid using Multer globally
- Middleware order affects behavior
- Access processed data via
req.file,req.files, andreq.body