Условно использовать промежуточное ПО в зависимости от параметра запроса express
Я пытаюсь решить, какое промежуточное программное обеспечение использовать на основе параметра запроса запроса.
в главном модуле у меня есть что-то вроде этого:
app.use(function(req, res){
if (req.query.something) {
// pass req, res to middleware_a
} else {
// pass req, res to middleware_b
}
});
middleware_a
и middleware_b
являются как самими приложениями, создаваемыми функцией express()
, так и не регулярными промежуточными функциями (function(req, res, next)
)
не может найти способ сделать это
Ответы
Ответ 1
В connect/express 'middleware' нет ничего волшебного: это просто функции, и вы можете называть их так же, как вы могли бы вызывать любую другую функцию.
Итак, в вашем примере:
app.use(function(req, res, next){
if (req.query.something) {
middlewareA(req, res, next);
} else {
middlewareB(req, res, next);
}
});
Тем не менее, могут быть более элегантные способы построения иерархических экспресс-приложений. Проверьте TJ video
Ответ 2
Я бы не использовал это промежуточное ПО - вместо этого в промежуточном программном обеспечении A и B проверяйте что-либо:
//Middleware A
app.use(function(req, res){
// If it doesn't match our condition then send to next middleware
if (!req.query.something) {
next();
} else {
// We're good - let this middleware do it thing
...
next();
}
});
То же самое с промежуточным ПО B
//Middleware B
app.use(function(req, res){
if (req.query.something) {
...
});
Ответ 3
Я знаю, что эта проблема устарела, но я хотел бы поделиться своим решением. Я решил это, выполнив функцию, которая вернула промежуточное ПО с обратным вызовом.
Пример промежуточного слоя:
function isAdminUser(callback){
return function(req, res, next){
var userId = callback(req);
// do something with the userID
next();
}
}
Затем вы можете сделать следующее в объекте express router
app.use(isAdminUser(function(res){
return res.body.userId
});
Ответ 4
Похоже, что вам, вероятно, не хватает трюка.
Каждый компонент промежуточного программного обеспечения является обработчиком запросов. Вы начинаете с рассмотрения первого обработчика запросов, затем смотрите следующий, затем следующий и т.д.
Здесь похожее промежуточное ПО выглядит следующим образом:
function myFunMiddleware(request, response, next) {
// Do stuff with the request and response.
// When we're all done, call next() to defer to the next middleware.
next();
}
Я предлагаю вам изменить код на что-то вроде этого.
app.use(function(request, response, next) {
if (request.url == "/") {
response.writeHead(200, { "Content-Type": "text/plain" });
response.end(".. Any custom msg..\n");
// The middleware stops here.
}
else {
next();
}});
Просьба через этот учебник, я уверен, что вы получите хороший обзор использования middlewares. Имейте счастливое кодирование.
Ответ 5
Я знаю, что я немного опоздал на эту тему, но вы можете использовать этот плагин
Экспресс условного дерева промежуточного программного обеспечения.
Он позволяет комбинировать множественное и асинхронное промежуточное ПО.
В частности, вы можете создать два класса, которые представляют ваше промежуточное ПО (middleware_a, middleware_b) и внутри методов applyMiddleware
, которые будут проживать в этих классах, вернуть обещание, созданное вашей функцией промежуточного программного обеспечения, или пользовательское решение с вашим результатом от вашего промежуточного программного обеспечения снова.
Затем в вашем основном js файле вы можете создать цепочку в зависимости от ваших потребностей, чтобы условно совместить эти посредники! Ознакомьтесь с документами для получения дополнительной информации, после проверки кода он станет более понятным.