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

Условно использовать промежуточное ПО в зависимости от параметра запроса 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))

не может найти способ сделать это

4b9b3361

Ответ 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 файле вы можете создать цепочку в зависимости от ваших потребностей, чтобы условно совместить эти посредники! Ознакомьтесь с документами для получения дополнительной информации, после проверки кода он станет более понятным.