Как использовать промежуточное программное обеспечение express на уровне маршрутизатора

#node.js #express

Вопрос:

Я пытаюсь добавить простую функцию промежуточного программного обеспечения для каждого запроса на уровне маршрутизатора.

В документах говорится:

функция промежуточного программного обеспечения без пути подключения будет выполняться для каждого запроса к маршрутизатору

В моем приложении у меня есть только один маршрутизатор с одной конечной точкой, которая прослушивает каждый запрос, и я размещаю свою функцию промежуточного программного обеспечения над этой конечной точкой, но промежуточное программное обеспечение никогда не запускается.

Экспресс-настройка:

 const initializeExpress = (): void => {
  const port = process.env.PORT;
  const app = express();
  app.use(helmet());
  app.use(express.json());
  app.use(cors());
  app.use('/api', Router);

  app.listen(port, () => {
    console.log(`Listening for requests at http://localhost:${port}`);
  });
};
 

Мой код маршрутизатора:

 const Router = express.Router();

Router.use((req, res, next) => {
  const token = req.header('authorization');
  if (!token) res.status(401).send({ message: 'Unauthorized' });

  const isAuthenticated = isAuthorized(token!);
  if (isAuthenticated) {
    next();
  } else {
    res.status(401).send({ message: 'Unauthorized' });
  }
});

Router.get(
  '/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?',
  async (req, res): Promise<void> => {
    const routeParams = filterRouteParams(req.params);
    const path = basePath   getPathFromRouteParams(routeParams)   '/data.json';
    if (await pathExists(path)) {
      const data = await getJsonFromPath(path);
      if (!isEmpty(data)) {
        res.status(200).json(data);
        return;
      }
      res.status(400).send({ message: 'Data not found' });
    }
  }
);
 

Что я здесь делаю не так?

Комментарии:

1. Показывает ли это какую-либо ошибку? Или это не входит в функцию промежуточного программного обеспечения?

2. Мой маршрут GET запускается без вызова промежуточного программного обеспечения, без ошибок

Ответ №1:

На каком маршруте будет активировано промежуточное программное обеспечение, вам необходимо определить его.

Есть два способа сделать это

Во-первых, вызовите промежуточное программное обеспечение перед вашим маршрутом:

 const Router = express.Router();

const myMiddleware = (req, res, next) => {
  const token = req.header('authorization');
  if (!token) res.status(401).send({ message: 'Unauthorized' });

  const isAuthenticated = isAuthorized(token!);
  if (isAuthenticated) {
    next();
  } else {
    res.status(401).send({ message: 'Unauthorized' });
  }
}

Router.get(
  '/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?',
myMiddleware(), //Call middleware here 
  async (req, res): Promise<void> => {
    const routeParams = filterRouteParams(req.params);
    const path = basePath   getPathFromRouteParams(routeParams)   '/data.json';
    if (await pathExists(path)) {
      const data = await getJsonFromPath(path);
      if (!isEmpty(data)) {
        res.status(200).json(data);
        return;
      }
      res.status(400).send({ message: 'Data not found' });
    }
  }
);
 

Во-вторых, вызов промежуточного программного обеспечения для всех определенных вами маршрутов:

 const Router = express.Router();

const myMiddleware = (req, res, next) => {
  const token = req.header('authorization');
  if (!token) res.status(401).send({ message: 'Unauthorized' });

  const isAuthenticated = isAuthorized(token!);
  if (isAuthenticated) {
    next();
  } else {
    res.status(401).send({ message: 'Unauthorized' });
  }
}

Router.use('/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?', myMiddleware());

Router.get(
  '/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?'
  async (req, res): Promise<void> => {
    const routeParams = filterRouteParams(req.params);
    const path = basePath   getPathFromRouteParams(routeParams)   '/data.json';
    if (await pathExists(path)) {
      const data = await getJsonFromPath(path);
      if (!isEmpty(data)) {
        res.status(200).json(data);
        return;
      }
      res.status(400).send({ message: 'Data not found' });
    }
  }
);
 

Комментарии:

1. Это действительно решение моей проблемы, но разве я не могу назначить промежуточное программное обеспечение для всех моих маршрутов в этом маршрутизаторе одним назначением?

2. Второй способ, который я предложил сделать именно так. Адрес, который вы используете, Router.use и все его производные попадут в промежуточное программное обеспечение.