Search code examples
expressmiddleware

use middleware in get request conditionally


i am using express routes. this is my request

import { Router, Request, Response, NextFunction } from "express";
import { celebrate, Joi, Segments } from "celebrate";

const route = Router();

export default (app: Router) => {
route.get("/:id",
    celebrate({
      [Segments.PARAMS]: Joi.object({
        id: Joi.string().required().label("Store Id")
      })
    }),
    basicAuth, //a middleware
    asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
      // some operations.
      return res.status(202).json(storeDetails);
    })
  );
}

here how can i use the basicAuth middleware conditionally such that basicAuth is used when id=="me" else another middleware isAuth is used.


Solution

  • You can just call the middleware manually if your conditional is met:

    route.get("/:id",
        celebrate({
          [Segments.PARAMS]: Joi.object({
            id: Joi.string().required().label("Store Id")
          })
        }),
        asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
            if (req.params.id === "me") {
                 // call basicAuth middleware manually
                 basicAuth(req, res, err => {
                     if (err) {
                          // send error response here
                          next(err);
                     } else {
                          // continue processing here now that basicAuth has been verified
                     }
                 });
            
            } else {
              // not "me"
    
              // some operations.
              return res.status(202).json(storeDetails);
            }
        })
      );
    }