2016-03-09 2 views
4

Для маршрутизации я хотел бы, чтобы мое промежуточное программное обеспечение передало запрос маршрутам, определенным в папке/html, на сервер HTML (ejs), и если заголовок Content-Type является application/json, используйте маршруты, определенные в папке/api.Роутер Expressjs на основе заголовка Content-Type

Но я не хочу определять это в каждом маршруте. Так что я не ищешь промежуточный слой, который определяет некоторые req.api свойства, что я могу проверить в каждом маршруте

app.get('/', function(req, res) { 
    if(req.api_call) { 
     // serve api 
    } else { 
     // serve html 
    } 
}); 

Но я хотел бы что-то вроде этого:

// HTML folder 
app.get('/', function(req, res) { 
    res.send('hi'); 
}); 

// API folder 
app.get('/', function(req, res) { 
    res.json({message: 'hi'}); 
}); 

это возможное и если да, то как я могу это сделать?

Я хотел бы, чтобы это что-то вроде этого: работа

app.use(checkApiCall, apiRouter); 
app.use(checkHTMLCall, htmlRouter); 
+0

См. Здесь о проверке типа содержимого запроса - http://stackoverflow.com/questions/18902293/nodejs-validating-request-type-checking-for-json-or-html – drorw

+0

Я знаю, как проверить содержимое запроса -тип. Проблема, с которой я сталкиваюсь, - это желание использовать разные экспресс-маршрутизаторы на основе Content-Type, а не только URL-адрес, например 'app.use ('/ api', apiRouter); ' – CreasolDev

+0

Поскольку маршрутизаторы по своей сути работают по пути, мне интересно, может ли быть промежуточное программное обеспечение, которое проверяет тип содержимого и изменяет путь как псевдо-путь, который включает в себя что-то для представления содержимого и затем установите маршрутизаторы для обслуживания измененного пути. Например, запрос ''/''с типом содержимого JSON может быть изменен на псевдо-путь'/api /' ', поэтому вы будете обслуживать это с помощью' app.get ('/ api /', ...) '. Я не совсем уверен, что маршрутизаторы по-прежнему работают после того, как вы изменили путь в запросе, но можете попробовать это достаточно легко. – jfriend00

ответ

5

Вы можете вставить в качестве первого промежуточного слоя в цепи Экспресс, обработчик промежуточного, который проверяет тип запроса и затем изменяет 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.

+1

Добавил еще несколько вариантов ответа. Последние показывают, что промежуточное программное обеспечение может изменять URL-адрес в псевдо-путь, который затем будет сопоставляться с Express-маршрутизаторами. Таким образом, вы можете иметь каждый набор запросов в своем собственном маршрутизаторе и одну простую промежуточную функцию, которая направляет запрос на соответствующий маршрутизатор, просто изменяя 'req.url' в псевдо-URL. – jfriend00

+0

IMHO, я думаю, что это «грязный» взлом, но он работает, поэтому w/e xD Спасибо человеку! Я ДЕЙСТВИТЕЛЬНО выполнил эту работу! Потрясающие!! – CreasolDev

+1

@CreasolDev - это немного взломать, но это довольно чистый хак, поскольку он полагается только на то, что вы можете изменить 'req.url' в раннем промежуточном программном обеспечении, которое используется и по другим причинам. Помимо этого, это прямая маршрутизация, поэтому на самом деле это довольно чистый хак, когда ходят хаки. – jfriend00

Смежные вопросы