Как вызвать несколько экспресс-промежуточных программ вручную - PullRequest
1 голос
/ 20 июня 2019

У меня есть ситуация, когда я хочу вызвать несколько промежуточных программ экспресс-обслуживания, в зависимости от полезной нагрузки запроса.

Эти промежуточные программы генерируются из экспресс-проверки checkSchema способ.

Итак, я написал промежуточное программное обеспечение, которое получает доступ к объекту запроса, и я могу прочитать свойство из полезной нагрузки запроса, а затем принять решение о том, какая схема должна быть запущена.

Реализация хотела бы это.

let app = express();

let schema1 = checkSchema({
  field1: {
    in: ["body"],
    exists: {
      errorMessage: "field1 is missing",
    }
  }
});

let schema2 = checkSchema({
  field2: {
    in: ["body"],
    exists: {
      errorMessage: "field 2 is missing",
    }
  }
});

app.post("/resource", (req, res, next) => {
  if(req.body.type === "TYPE1") {
    // Invoke schema1 middleware
  }
  if(req.body.type === "TYPE2") {
    // Invoke schema2 middleware
  }
});

Здесь схема 1 и схема 2 не являются одним промежуточным программным обеспечением. Это массив промежуточного программного обеспечения.

Если бы это было промежуточное ПО, я мог бы вызвать schema1 (req, res, next);

Если кто-нибудь прошел через это, подскажите, пожалуйста, каков подход к запуску массива промежуточного программного обеспечения вручную.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я выпустил Экспресс-валидатор v6.0.0 , который должен помочь в решении подобных проблем.

Теперь есть метод .run(req), который должен позволить вам действовать с помощью экспресс-валидатора обязательным образом .

Для вашего случая использования вы можете сделать следующее:

app.post("/resource", async (req, res, next) => {
  if(req.body.type === "TYPE1") {
    await Promise.all(schema1.map(chain => chain.run(req)));
  }
  if(req.body.type === "TYPE2") {
    await Promise.all(schema2.map(chain => chain.run(req)));
  }
});

, поскольку checkSchema возвращает массивцепочек проверки , код сопоставляет каждое из них с их соответствующим обещанием выполнения.
Когда все обещания выполнены, ваш код может продолжать выполняться и делать все, что вы захотите.Может быть, проверьте, есть ли ошибки с validationResult, соответственно отобразите другую страницу и т. Д. - до вас!

0 голосов
/ 20 июня 2019

По этому вопросу Использовать массив промежуточных программ в express.js , есть один репозиторий: https://github.com/blakeembrey/compose-middleware:

Согласно readme:

app.use(compose([
  function (req, res, next) {},
  function (err, req, res, next) {},
  function (req, res, next) {}
]))

Итак, что вы можете сделать:

app.post("/resource", (req, res, next) => {
  if(req.body.type === "TYPE1") {
    compose(schema1)(req,res,next);
  }
  if(req.body.type === "TYPE2") {
    compose(schema2)(req,res,next);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...