Hapi 框架中如何使用 Hapi-Api-Errors 插件进行错误处理?

Hapi 是一个 Node.js 的 Web 框架,它以插件化的方式构建,使得开发者可以根据自己的需求选择性地使用不同的插件来扩展框架的功能。其中,Hapi-Api-Errors 是一个用于处理 API 错误的插件,可以帮助我们更好地管理和处理错误。

安装 Hapi-Api-Errors

使用 npm 安装 Hapi-Api-Errors:

使用 Hapi-Api-Errors

在 Hapi 中使用 Hapi-Api-Errors 需要进行如下步骤:

  1. 注册插件
  2. 配置插件
  3. 在路由中使用插件

注册插件

在 Hapi 中注册插件的方式有很多种,这里我们演示一种常见的方式:在服务器启动时通过 server.register 方法注册插件。

const Hapi = require('hapi');
const HapiApiErrors = require('hapi-api-errors');

const server = new Hapi.Server();

server.connection({
  port: 3000,
  host: 'localhost',
});

server.register({
  register: HapiApiErrors,
  options: {
    // 配置选项
  },
}, (err) => {
  if (err) {
    console.error(err);
  }
});

配置插件

Hapi-Api-Errors 的配置选项包括:

  • errorKey:错误信息的键名,默认为 error
  • stackKey:堆栈信息的键名,默认为 stack
  • responseCodeKey:响应状态码的键名,默认为 code
  • isHttpError:判断是否为 HTTP 错误的函数,默认为判断状态码是否在 400599 之间。
  • override:覆盖现有错误处理程序的选项,默认为 false
server.register({
  register: HapiApiErrors,
  options: {
    errorKey: 'err',
    stackKey: 'stackTrace',
    responseCodeKey: 'status',
    isHttpError: (err) => {
      return err.status >= 400 && err.status <= 599;
    },
    override: true,
  },
}, (err) => {
  if (err) {
    console.error(err);
  }
});

在路由中使用插件

在路由处理程序中,可以使用 reply 方法的 HapiApiErrors 扩展方法来返回错误响应。

server.route({
  method: 'GET',
  path: '/users/{id}',
  handler: (request, reply) => {
    const id = request.params.id;

    if (!id) {
      return reply.badRequest('User ID is required');
    }

    // 查询用户信息
    const user = getUserById(id);

    if (!user) {
      return reply.notFound('User not found');
    }

    return reply(user);
  },
});

replyHapiApiErrors 扩展方法包括:

  • badRequest:返回 400 错误。
  • unauthorized:返回 401 错误。
  • forbidden:返回 403 错误。
  • notFound:返回 404 错误。
  • conflict:返回 409 错误。
  • unprocessableEntity:返回 422 错误。
  • internal:返回 500 错误。

示例代码

下面是一个完整的示例代码:

const Hapi = require('hapi');
const HapiApiErrors = require('hapi-api-errors');

const server = new Hapi.Server();

server.connection({
  port: 3000,
  host: 'localhost',
});

server.register({
  register: HapiApiErrors,
  options: {
    errorKey: 'err',
    stackKey: 'stackTrace',
    responseCodeKey: 'status',
    isHttpError: (err) => {
      return err.status >= 400 && err.status <= 599;
    },
    override: true,
  },
}, (err) => {
  if (err) {
    console.error(err);
  }
});

server.route({
  method: 'GET',
  path: '/users/{id}',
  handler: (request, reply) => {
    const id = request.params.id;

    if (!id) {
      return reply.badRequest('User ID is required');
    }

    // 查询用户信息
    const user = getUserById(id);

    if (!user) {
      return reply.notFound('User not found');
    }

    return reply(user);
  },
});

server.start((err) => {
  if (err) {
    console.error(err);
  } else {
    console.log(`Server running at: ${server.info.uri}`);
  }
});

function getUserById(id) {
  // 查询用户信息的逻辑
}

总结

Hapi-Api-Errors 插件可以帮助我们更好地处理 API 错误,让我们的代码更加简洁和易读。在使用该插件时,我们需要注册插件、配置选项和在路由中使用插件。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658b73e7eb4cecbf2d0b7cb0


纠错
反馈