如何从Hapijs中组合处理程序?

时间:2016-01-30 01:54:27

标签: hapijs

我需要在一些处理程序中进行一些额外的身份验证。有没有办法以可组合的方式这样做?

export async function handler(request) {
  const user = request.auth.credentials;
  const customer = FindCustomer(user);
  if (!customer) {
    throw Boom.forbidden('user is not a customer');
  }
  if (!customer.verified) {
    throw Boom.forbidden('customer not validated');
  }

  // actual handler logic
}

有没有办法将其包装起来,以便某些路由已经在请求对象中提供了客户?

2 个答案:

答案 0 :(得分:1)

您可以在请求生命周期中使用extension points。在您的情况下,' onPostAuth'扩展点将是理想的。

server.ext('onPostAuth', function (request, reply){

  const user = request.auth.credentials;
  const customer = FindCustomer(user);
  if (!customer) {
    return reply (Boom.forbidden('user is not a customer'));
  }
  if (!customer.verified) {
    return reply(Boom.forbidden('customer not validated'));
  }
  reply.continue();
});

答案 1 :(得分:1)

补充ZeMoon的回答,您可以像这样实施server.ext('onPostAuth', function (request, reply) { if(request.route.settings.plugins.verifyCustomer) { const user = request.auth.credentials; const customer = FindCustomer(user); if (!customer) { return reply (Boom.forbidden('user is not a customer')); } if (!customer.verified) { return reply(Boom.forbidden('customer not validated')); } } reply.continue(); });

plugins.verifyCustomer

然后在路由中添加配置server.route({ method: 'get', path: '/test1', handler: function(request, reply) { // Handler logic here }, config: { plugins: { verifyCustomer: true } } });

data_banks