Зарегистрируйте новый маршрут во время выполнения в NodeJs/ExpressJs

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

Я работаю над приложением, которое позволяет создавать различные API, которые работают на NodeJ. Пользовательский интерфейс выглядит так:

новое правило с двумя конечными точками (GET, POST

Как вы можете видеть, этот фрагмент кода содержит две конечные точки (GET,POST) и, как только я нажимаю "Сохранить", он создает файл.js, расположенный по пути, где приложение Nodejs ищет свои конечные точки (например, myProject \ dynamicRoutes \ rule_test.js).

У меня проблема в том, что сервер Nodejs работает во время разработки кода, и я не могу вызвать эти новые конечные точки, пока не перезапущу сервер еще раз (и ExpressJs не обнаружит файл).

Моя главная проблема заключается в том, есть ли способ зарегистрировать новые маршруты во время работы NodeJ (ExpressJ)?

Я безуспешно пытался сделать следующее:

app.js

Это работает, если сервер перезапущен. Я попытался включить эту библиотеку ( https://www.npmjs.com/package/express-dynamic-router, но не работает во время выполнения.)

//this is dynamic routing function
function handleDynamicRoutes(req,res,next) {    
    var path = req.path; //http://localhost:8080/api/rule_test
    //LoadModules(path)
    var controllerPath = path.replace("/api/", "./dynamicRoutes/");
    var dynamicController = require(controllerPath);
    dynamicRouter.index(dynamicController[req.method]).register(app);
    dynamicController[req.method] = function(req, res) {
       //invocation
    }

    next();
}

app.all('*', handleDynamicRoutes);

Наконец, я прочитал эту статью ( #NodeJS / #ExpressJS: Добавление маршрутов динамически во время выполнения), но я не мог понять, как это может мне помочь.

Я верю, что это может быть как-то возможно, но я чувствую себя немного потерянным. Кто-нибудь знает, как этого добиться? Я получаю сообщение об ошибке CANNOT GET после каждого создания файла.

2 ответа

Отказ от ответственности: пожалуйста, знайте, что это считается плохим проектом с точки зрения стабильности и безопасности, чтобы позволить пользователю или даже администратору вводить исполняемый код через веб-формы. Относитесь к этой теме как к академической дискуссии и не используйте этот код в производстве!


Посмотрите на этот простой пример, который добавляет новый маршрут во время выполнения:

app.get('/subpage', (req, res) => res.send('Hello subpage'))

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

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

require('path/to/new/module')(app)

Достаточно ли для вас req.params?

app.get('/basebath/:path, (req,res) => {
  const content = require('content/' + req.params.path);
  res.send(content);
});

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

http://www.mywebsite.com/basepath/bergur

Затем маршрутизатор попытается получить файл content/bergur.js и отправить его содержимое.

Другие вопросы по тегам