Вопрос по express, node.js – Удалить сопоставления маршрутов в NodeJS Express

16

У меня есть маршрут, обозначенный как:

<code>app.get('/health/*', function(req, res){
    res.send('1');
});
</code>

Как я могу удалить / переназначить этот маршрут в пустой обработчик во время выполнения?

Ваш Ответ

7   ответов
21

начиная с 3.0.5) сохраняет все свои маршруты вapp.routes. Отдокументаци:

В объекте app.routes хранятся все маршруты, определенные сопоставленным глаголом HTTP. Этот объект может использоваться для возможностей самоанализа, например, Express использует это внутренне не только для маршрутизации, но и для обеспечения поведения OPTIONS по умолчанию, если не используется app.options (). Ваше приложение или инфраструктура также могут удалять маршруты, просто удаляя их из этого объекта.

Вашapp.routes должно выглядеть примерно так:

{ get: 
   [ { path: '/health/*',
       method: 'get',
       callbacks: [Object],
       keys: []}]
}

Так, ты должен быть в состоянии пройти черезapp.routes.get пока вы не найдете то, что ищете, а затем удалите его.

Это круто. отличная работ lostinplace
Это супер полезно. Однако, когда я продолжаю пробовать это, я продолжаю сталкиваться с действительно странными проблемами. Можно ли вообще написать простой пример? streetlight
В частности, он также удаляет все мои статические сопоставления ресурсов - вы знаете, почему это так? Вот мой вопрос для этого, у которого есть больше деталей ... / Stackoverflow.com вопросы / 15487084 / ... streetlight
Больше нет, по состоянию на [email protected] Закажи мой ответ ниже laggingreflex
22

Это удаляетapp.use связующее ПО и / илиapp.VERB (получить / отправить) маршруты. Проверено на экспрессе @ 4.9.5

var routes = app._router.stack;
routes.forEach(removeMiddlewares);
function removeMiddlewares(route, i, routes) {
    switch (route.handle.name) {
        case 'yourMiddlewareFunctionName':
        case 'yourRouteFunctionName':
            routes.splice(i, 1);
    }
    if (route.route)
        route.route.stack.forEach(removeMiddlewares);
}

Обратите внимание, что это Требует что функции промежуточного ПО / маршрута имеют Имена:

app.use(function yourMiddlewareFunctionName(req, res, next) {
    ...          ^ named function
});

Это не будет работать если функция анонимная:

app.get('/path', function(req, res, next) {
    ...          ^ anonymous function, won't work                    
});
В приведенном выше,route.path содержит имя пути - если вы хотите удалить анонимный маршрут по пути, вы можете включить его вместо этого. Jesse
4

пока сервер работает, хотя API для этого не существует, поэтому это не рекомендуется.

/* Monkey patch express to support removal of routes */
require('express').HTTPServer.prototype.unmount = function (route) {
    for (var i = 0, len = this.stack.length; i < len; ++i) {
        if (this.stack[i].route == route) {
            this.stack.splice(i, 1);
            return true;
        };
    }
    return false;
}

Это то, что мне нужно, так что обидно, что нет подходящего API, но Express просто имитирует, что здесь делает connect.

4
app.get$ = function(route, callback){
  var k, new_map;

  // delete unwanted routes
  for (k in app._router.map.get) {
    if (app._router.map.get[k].path + "" === route + "") {
      delete app._router.map.get[k];
    }
  }

  // remove undefined elements
  new_map = [];
  for (k in app._router.map.get) {
    if (typeof app._router.map.get[k] !== 'undefined') {
      new_map.push(app._router.map.get[k]);
    }
  }
  app._router.map.get = new_map;

  // register route
  app.get(route, callback);
};

app.get$(/awesome/, fn1);
app.get$(/awesome/, fn2);

http://...awesome fn2 будет называться

Редактировать: исправил код

Edit2: исправлено снова ...

Edit3: Может быть, более простое решение - очистить маршруты в какой-то момент и снова заполнить их:

// remove routes
delete app._router.map.get;
app._router.map.get = [];

// repopulate
app.get(/path/, function(req,res)
{
    ...
});
3

та. Я тоже хотел это сделать, но у меня не было именованных функций для маршрутов, поэтому я написал модуль npm, который может удалять маршруты, указывая путь маршрутизации.

Ну вот

https: //www.npmjs.com/package/express-remove-rout

2

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

Кажется, я не могу изменить существующие маршруты вообще, как только они будут созданы. Это включает в себя добавление нового промежуточного программного обеспечения. Хотя сейчас я собираюсь использовать следующую ('route') команду lostinplace
1

новый Express API, похоже, не поддерживает это.

Действительно ли необходимо полностью удалить отображение? Если все, что вам нужно, это прекратить обслуживание маршрута, вы можете просто начать возвращать некоторую ошибку из обработчика.

Единственный (очень странный) случай, когда этого было бы недостаточно, если бы динамические маршруты добавлялись все время, а вы хотели полностью избавиться от старых, чтобы избежать накопления слишком большого количества ...

Если вы хотите переназначить его (либо сделать что-то другое, либо сопоставить его с чем-то, что всегда возвращает ошибку), вы всегда можете добавить еще один уровень косвенности:

var healthHandler = function(req, res, next) {
    // do something
};

app.get('/health/*', function(req, res, next) {
    healthHandler(req, res, next);
});

// later somewhere:

healthHandler = function(req, res, next) {
    // do something else
};

По моему мнению, это лучше / безопаснее, чем манипулировать некоторыми недокументированными внутренностями в Express.

Мой вариант использования позволял пользователям настраивать маршруты в CMS (интерфейсное приложение на основе браузера). Я также хочу охватить эти маршруты на основе информации заголовка, такой какHost поле. Я, вероятно, собираюсь просто перенаправить все запросы к одному и тому же обработчику, а затем выполнить собственную настраиваемую маршрутизацию за пределами API маршрутизации Express. Brennan Cheung

Похожие вопросы