Validation chain not working in express-validator

38 Views Asked by At
const express = require("express");
const router = express.Router();
const User = require("../Models/User");
const { body, validationResult } = require("express-validator");

//post route for registering user(No auth required)
router.post(
  "/",
  [
    body("name", "Name cannot be empty").notEmpty().customSanitizer(value => {
      return escape(value);
    }),
    body("email", "Enter a valid email").isEmail(),
    body(
      "password",
      "Password must be 8characters long. 1 lowercase, 1 uppercase, 2 number and 1 special character is required"
    ).isStrongPassword({
      minLength: 8,
      minLowercase: 1,
      minUppercase: 1,
      minNumbers: 1,
      minSymbols: 1,
    }),
  ],
  async (req, res) => {
    const result = validationResult(req);
    if (result.isEmpty()) {
      //All validations passed
      try {
        const user = User(req.body);
        await user.save();
        res.send(req.body);
      } catch (err) {
        return res.status(400).json({ error: "Email already exists" });
      }
    }
    res.send({ errors: result.array() });
  }
);

module.exports = router;

Here in my Express code if I am just using the .notEmpty() method of express-validator with my name field I am not facing any error and it works perfectly fine. But if I use .escape() method along with it, then my Express application crashes by giving the following error

node:internal/errors:491
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:400:5)
    at ServerResponse.setHeader (node:_http_outgoing:663:11)
    at ServerResponse.header (C:\Web Development\Swift Notes\Backend\node_modules\express\lib\response.js:794:10)
    at ServerResponse.send (C:\Web Development\Swift Notes\Backend\node_modules\express\lib\response.js:174:12)
    at ServerResponse.json (C:\Web Development\Swift Notes\Backend\node_modules\express\lib\response.js:278:15)
    at ServerResponse.send (C:\Web Development\Swift Notes\Backend\node_modules\express\lib\response.js:162:21)
    at C:\Web Development\Swift Notes\Backend\Routes\auth.js:37:9
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

I referred to the express-validator documentation and my code is exactly as per their documentation. Why am I not able to use multiple methods by chaining them?

0

There are 0 best solutions below