Вызов уже определенных маршрутов на других маршрутах в 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. Я стараюсь, чтобы мое приложение было максимально модульным. Мысли?
Спасибо
Ответы
Ответ 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');
}); });
Надеюсь, это поможет.