Вы можете вставить в качестве первого промежуточного слоя в цепи Экспресс, обработчик промежуточного, который проверяет тип запроса и затем изменяет req.url
в псевдо URL, добавив к нему префиксный путь. Эта модификация затем заставит этот запрос перейти только к определенному маршрутизатору (маршрутизатор, настроенный для обработки этого конкретного префикса URL). Я проверил это работает Экспресс со следующим кодом:
var express = require('express');
var app = express();
app.listen(80);
var routerAPI = express.Router();
var routerHTML = express.Router();
app.use(function(req, res, next) {
// check for some condition related to incoming request type and
// decide how to modify the URL into a pseudo-URL that your routers
// will handle
if (checkAPICall(req)) {
req.url = "/api" + req.url;
} else if (checkHTMLCall(req)) {
req.url = "/html" + req.url;
}
next();
});
app.use("/api", routerAPI);
app.use("/html", routerHTML);
// this router gets hit if checkAPICall() added `/api` to the front
// of the path
routerAPI.get("/", function(req, res) {
res.json({status: "ok"});
});
// this router gets hit if checkHTMLCall() added `/api` to the front
// of the path
routerHTML.get("/", function(req, res) {
res.end("status ok");
});
Примечание: Я не заполнял в коде checkAPICall()
или checkHTMLCall()
, потому что вы не были полностью конкретную информацию о том, как вы хотели те работать. Я издевался над ними на своем тестовом сервере, чтобы понять, что концепция работает. Я предполагаю, что вы можете предоставить соответствующий код для этих функций или заменить свой собственный оператор if
.
До ответа
Я просто проверить, что вы можете изменить req.url
Экспресс промежуточного слоя, так что если у вас есть некоторое промежуточное программное обеспечение, изменяющий req.url
, это будет влиять на маршрутизацию этого запроса.
// middleware that modifies req.url into a pseudo-URL based on
// the incoming request type so express routing for the pseudo-URLs
// can be used to distinguish requests made to the same path
// but with a different request type
app.use(function(req, res, next) {
// check for some condition related to incoming request type and
// decide how to modify the URL into a pseudo-URL that your routers
// will handle
if (checkAPICall(req)) {
req.url = "/api" + req.url;
} else if (checkHTMLCall(req)) {
req.url = "/html" + req.url;
}
next();
});
// this will get requests sent to "/" with our request type that checkAPICall() looks for
app.get("/api/", function(req, res) {
res.json({status: "ok"});
});
// this will get requests sent to "/" with our request type that checkHTMLCall() looks for
app.get("/html/", function(req, res) {
res.json({status: "ok"});
});
Пожилым Ответ
я смог успешно поставить запрос обратного вызова перед экспресс, как это и видно, что он был успешно модифицирования входящий URL в то повлиять на экспресс-маршрутизации, как это :
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(function(req, res) {
// test modifying the URL before Express sees it
// this could be extended to examine the request type and modify the URL accordingly
req.url = "/api" + req.url;
return app.apply(this, arguments);
});
server.listen(80);
app.get("/api/", function(req, res) {
res.json({status: "ok"});
});
app.get("/html/", function(req, res) {
res.end("status ok");
});
Этот пример (который я тестировал) просто жестко привязывает добавить «/ API» на передней части URL, но вы могли бы че ck введите тип входящего запроса, а затем внесите модификацию URL-адреса соответствующим образом. Я еще не изучил, можно ли это сделать полностью в Express.
В этом примере, когда я попросил «/», мне дали JSON.
См. Здесь о проверке типа содержимого запроса - http://stackoverflow.com/questions/18902293/nodejs-validating-request-type-checking-for-json-or-html – drorw
Я знаю, как проверить содержимое запроса -тип. Проблема, с которой я сталкиваюсь, - это желание использовать разные экспресс-маршрутизаторы на основе Content-Type, а не только URL-адрес, например 'app.use ('/ api', apiRouter); ' – CreasolDev
Поскольку маршрутизаторы по своей сути работают по пути, мне интересно, может ли быть промежуточное программное обеспечение, которое проверяет тип содержимого и изменяет путь как псевдо-путь, который включает в себя что-то для представления содержимого и затем установите маршрутизаторы для обслуживания измененного пути. Например, запрос ''/''с типом содержимого JSON может быть изменен на псевдо-путь'/api /' ', поэтому вы будете обслуживать это с помощью' app.get ('/ api /', ...) '. Я не совсем уверен, что маршрутизаторы по-прежнему работают после того, как вы изменили путь в запросе, но можете попробовать это достаточно легко. – jfriend00