skip to Main Content

I’m encountering an issue while trying to access req.body within a middleware function in my Node.js application. Whenever I attempt to access req.body, it consistently returns empty, despite expecting data to be present in the request body. I’ve checked my middleware setup and made sure that body-parser middleware is correctly configured, yet the problem persists.

Could anyone shed some light on why req.body might be empty in this scenario? What are some common pitfalls or misconfigurations that could lead to this behavior?
userExists.js

I’ve already confirmed the following:

Middleware Order: I’ve ensured that the middleware responsible for parsing the request body is placed before the middleware where I’m trying to access req.body.

Parsing Configuration: body-parser is set up to handle JSON bodies using bodyParser.json(), matching the content type of my requests.

Request Content-Type: The Content-Type header of the incoming request is appropriate for the type expected by body-parser.

Body Data Integrity: I’ve verified that the request contains a body with data; it’s not being sent empty.

Despite these checks, I’m still at a loss as to why req.body remains empty. Any insights or troubleshooting tips would be greatly appreciated. Thank you!

const User = require("../Model/userSchema");

const userExists = async (req, res, next) => {
  const { email, password, confirmPassword } = req.body;

  console.log(req.body);

  console.log("email:", email);
  console.log("password:", password);
  console.log("confirmPassword:", confirmPassword);

  const emailExist = await User.findOne({ email });
  if (emailExist) {
    return res.status(400).send({ message: "Email Id already exists" });
  }

  if (password !== confirmPassword) {
    return res.status(400).send({ message: "Passwords do not match" });
  }

  next();
};

module.exports = userExists;

index.js

const express = require("express");
const dotenv = require("dotenv");
const cors = require("cors");
const connectDB = require("./db/db");
const authRoutes = require("./routes/user");
const bodyParser = require("body-parser");
const multer = require("multer");
const { storage } = require("./config/storage");
const { register } = require("./controllers/user");
const userExists = require("./middleware/userExist");

const app = express();

dotenv.config();

const port = process.env.PORT || 5001;

//middlewares
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
const upload = multer({ storage });

//routes
app.use("/api/auth", authRoutes);

//routes with files

app.post("/api/auth/register", userExists, upload.single("file"), register);

connectDB();

app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

Note:- I created a userExist middleware to check if a user with the same email ID already exists. If a user with a matching email is found, images will not be uploaded to the cloud. Additionally, if the user’s password and confirmation password do not match, the image will also not be uploaded to the cloud.

2

Answers


  1. Here the issue is order of middleware execution .

    app.post("/api/auth/register",upload.single("file"), userExists, register);
    

    You need to check the order of middleware , if any middleware that rely on parsed data.

    • Create one testing route and check is it printing anything ?

      app.post("/test", (req, res) => {
            console.log(req.body)
        });
      
    Login or Signup to reply.
  2. As we have discussed over the comments, there is a conflict between Multer and Express body-parser. While Mutler will work only with multipart/form-data, body-parser will fail in that case. Therefore any validations based on the req.body created by body-parser will be impossible.

    However, Multer can do validations. It allows validations during the process of upload. As one of the options, fileFilter property in Multer can be used for custom validations too. The citations below show similar questions and answers.

    The example code below shows the same under the context of your requirement.

    server.js

    const express = require('express');
    const multer = require('multer');
    
    const app = express();
    
    const upload = multer({
      dest: './uploads',
      fileFilter: async function (req, file, cb) {
        const checkUserId = async (userid) => {
          if (userid > 0 && userid < 10) {
            cb(null, true);
          } else {
            cb(new Error(`${userid} is an invalid userId - valid ids [1-9]`));
          }
        };
        await checkUserId(req.body.userid);
      },
    });
    
    app.get('/', (req, res, next) => {
      res.sendFile(__dirname + '/index.html');
    });
    
    app.post('/upload', upload.single('picture'), (req, res, next) =>
      res.send('uploaded')
    );
    
    app.use((err, req, res, next) => {
      res.send(`Error occurred : ${err}`);
    });
    
    app.listen(3000, () => console.log('L@3000'));
    

    Citations

    1. Stop upload for all files when validation fails #407

    2. How to validate multiple file uploads with multer expressjs

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search