2016-02-02 3 views
2

В настоящее время я использую 2:вручную сцепления Экспресс промежуточного программного

промежуточное программное

Express-jwt, который извлекает/проверяющий в JsonWebToken из запроса и собственного ПО промежуточного слоя, который проверяет, что JWT содержит конкретную информацию (разрешений).

Я хочу условно использовать эти средние (в зависимости от того, существует ли определенный атрибут swagger на маршруте).

Я хочу сделать что-то вроде этого:

let expressjwt = function(req, res, next) { ... }; 
let jwtValidator = function(req, res, next) { ... }; 

app.use((res, req, next) => { 
    if(req.swagger.someAttribute) { 
     expressjwt(req, res, jwtValidator(req, res, next)); 
     // The issue here is that jwtValidator will get called even if 
     // expressjwt produces an error 
    } else { 
     next(); 
    } 
}); 
+0

Зачем передавать jwtValidator на expressjwt? Почему вы не можете просто позвонить первым, а затем вторым? – Charlie

+0

Поскольку expressjwt является асинхронным и будет называть его последним аргументом, когда это будет сделано, с ошибкой или без (соглашение промежуточного программного обеспечения) – Nepoxx

+0

любое обновление по этому вопросу? – Charlie

ответ

1

Похоже, вопрос - «как вы условно называем службы B, только если служба успешно.»

Это одна из главных целей обещаний - это позволяет вам объединять асинхронные вызовы и условно разрешать их. При необходимости я могу отправить образец кода.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

0

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

if (req.swagger.someAttribute) { 
    Promise.fromCallback(cb => expressjwt(req, res, cb)) 
    .then(() => { 
     return jwtValidator(req, res, next); 
    }) 
    .catch(next); // Or deal with the rejection 
} else { 
    next(); 
} 

Promise.fromCallback полезно, потому что next() только вызывается с аргументами, если промежуточное программное обеспечение не удалось и таким образом станет promise.reject