Подтвердить что ты не робот

Вызов уже определенных маршрутов на других маршрутах в Express NodeJS

Я пишу веб-приложение в node.js с помощью Express. Я определил маршрут следующим образом:

app.get("/firstService/:query", function(req,res){
    //trivial example
    var html = "<html><body></body></html>"; 
    res.end(html)
});

Как повторно использовать этот маршрут из Express?

app.get("/secondService/:query", function(req,res){
    var data = app.call("/firstService/"+query);
    //do something with the data
    res.end(data);
});

Я не нашел ничего в документации API и предпочел бы не использовать другую библиотеку, такую ​​как "запрос", потому что это похоже на kludgey. Я стараюсь, чтобы мое приложение было максимально модульным. Мысли?

Спасибо

4b9b3361

Ответ 1

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

var queryHandler = require('special_query_handler'); 
// contains a method called firstService(req, res);

app.get('/firstService/:query', queryHandler.firstService);

// second app
app.get('/secondService/:query', queryHandler.secondService);

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

Что вы действительно хотите - это файл, заполненный операторами app.get() и app.post() со всеми обработчиками обратного вызова, которые живут в разных, более упорядоченных файлах.

Ответ 2

Аналогично тому, что сказал Гейтс, но я бы оставил function(req, res){} в вашем файле маршрутов. Поэтому я бы сделал что-то вроде этого:

routes.js

var myModule = require('myModule');

app.get("/firstService/:query", function(req,res){
    var html = myModule.firstService(req.params.query);
    res.end(html)
});

app.get("/secondService/:query", function(req,res){
    var data = myModule.secondService(req.params.query);
    res.end(data);
});

И тогда в вашем модуле ваша логика разделится следующим образом:

myModule.js

var MyModule = function() {
    var firstService= function(queryParam) {
        var html = "<html><body></body></html>"; 
        return html;
    }

    var secondService= function(queryParam) {
        var data = firstService(queryParam);
        // do something with the data
        return data;
    }

    return {
        firstService: firstService
       ,secondService: secondService
    }
}();

module.exports = MyModule;

Ответ 3

Если у вас много промежуточного ПО на вашем маршруте, вы можете воспользоваться распространением:

const router = express.Router();

const myMiddleware = [
    authenticationMiddleware(),
    validityCheckMiddleware(),
    myActualRequestHandler
];

router.get( "/foo", ...myMiddleware );
router.get( "/v1/foo", ...myMiddleware );

Ответ 4

Вы можете использовать модуль run-middleware точно для этого

app.runMiddleware('/firstService/query',function(responseCode,body,headers){
     // Your code here
})

Дополнительная информация:

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

Ответ 5

Я использовал следующий способ: на странице userpage.js

router.createSitemap = function(req, res, callback) {  code here callback(value);  }

в product.js

var userPageRouter = require('userpages'); 
userPageRouter.createSitemap(req, res, function () {
                            //console.log('sitemap');
                        });

Также можно использовать в том же маршрутизаторе userpage.js, который я могу использовать для другой маршрутизации. например.

router.get('/sitemap', function (req, res, next) {
    router.createSitemap(req, res, function () {
        res.redirect('/sitemap.xml');
    }); });

Надеюсь, это поможет.