前言
作为一个前端程序员,我们经常需要用到后端,而 Node.js 可以让我们在前端领域获得更丰富的选择。在 Node.js 生态系统中,有很多可以用来构建 Web API 的框架。在这些框架中,Hapi.js 是一个很好的选择,它能让你构建可维护和可伸缩的 Web 服务。同时,它也是一个非常流行的框架,community-driven,发展迅速。
在实际项目中,我们可能需要与后端使用消息中间件来进行通讯,例如 NATS (又叫作 Kafka 的轻量级版),它是一个高性能、低延迟,分布式消息服务,最初是由 Cloud Native Computing Foundation(CNCF)赞助使用的。
在本篇文章中,我们将结合使用 Hapi.js 和 NATS,介绍如何使用 generator-simple-hapi-and-nats-api,一个非常方便的生成器,它们可以非常容易地在 Hapi 和 NATS 之间创建 Web API。
安装
首先,你需要在你的本地机器上安装 Yeoman 和 generator-simple-hapi-and-nats-api:
npm install -g yo npm install -g generator-simple-hapi-and-nats-api
创建项目
进入一个新的目录,你可以通过运行以下命令来启动生成器:
yo simple-hapi-and-nats-api
接着,你需要回答几个问题,例如项目名称和描述,然后 Press Enter。接下来,你需要选择你要为你的项目使用的 Hapi.js 版本和 NATS 版本。这个选择非常重要,因为该选择会决定生成的代码的兼容性。
结构
执行成功后,将生成以下目录结构:
-- -------------------- ---- ------- --- ------ --- ------ - --- ---------- - --- -------------- - --- ------------- - --- ------- --- -------- --- ------------ --- ------- - --- -------- - --- --------- - --- ------- --- ------ --- -------- --- ---------
其中,
- app.js 是主应用程序,
- config 目录存储各种环境的配置,
- index.js 是应用程序入口点,
- plugins 目录包含注册到 Hapi 服务器的插件,
- routes 目录包含处理请求的路由器。
接下来我们来逐步学习这些文件是如何协同工作的。
配置
在 config
目录下,存放了各种环境下的配置文件,这些文件默认是针对 default
环境的,你可以通过设置环境变量 NODE_ENV
来加载其他的环境配置,例如
NODE_ENV=production npm start
此时将使用 production.js
中的配置。
默认情况下,该生成器已经为你提供了 4 个环境的配置选项:
- default.js:用于默认环境的配置。
- development.js:用于开发环境的配置,包括允许的 API 请求速率限制、数据库连接字符串等。
- production.js:用于生产环境的配置,包括日志级别、拥有的最大工作进程等。
- test.js:用于测试环境的配置,包括数据库连接 URL、测试运行时间等。
路由
路由定义如下:
-- -------------------- ---- ------- -- ----------------- ----- ------ - ----------------- ----- ------- - --------------------- ----- ----------- - -------------------------- -------------- - -- ------- ------ ----- ----------------------------- ----- ------- --------- -- - ----- -------- - ----------------------- ----- ------------------------------------------------- - ----- ----------------- -------- ------------------- -- ------ - -------- ---- - - --
这里定义了一个路由器,当你访问 /api/health
时,会触发调用一个 NATS 的服务 server.identity
(后面会提到),并 返回一个包含 success 属性的对象,表明服务状态是健康的。这是一个简单的 ARTS Endpoint 范例,其返回内容和状态代码可以根据实际应用的情况进行定义。
另外,这里的服务名称和版本是从 package.json 中获取的,你可以在这里添加其他的自定义参数。
插件
插件功能提供了轻松构建代码的方法,可以将在不同的代码文件中使用的函数、文件路径等,封装为插件名称,并在需要使用他们时注入到代码中,避免了很多重复的代码编写。
在本实例中,插件用于定义运行时需要的功能,包括 NATS 消费者、数据库连接、缓存服务等。插件差别于路由,它们是整个应用程序共享的。
这里的插件定义如下:
-- -------------------- ---- ------- -- ------------------ ----- ---- - --------------- ----- ------ - ----------------- ----- ------ - ------ ----- ------------ ------------ - ----------- ---- -- ------------ - ---- ------------------------ ---- ------------------------ ---- ----------------------- - -- -------------- - - ----- --------- --------- ----- -------- -------- -------- - -------------------------- --------- -- -- ------- -------------------------- --------- ------- ------------------------- --------- ------- - -
这个插件定义了一个新的业务日志记录器,并把它挂载到了符合 Hapi 插件规范的 server 对象上,提供了更强大、更多变更的管道功能。
类似于路由器,这里的插件定义也是一个数组。每个对象都应具有两个属性:
- plugin 构造器对象,必需
- options 插件的选项,可选
具有 register 方法的插件构造函数将自动由 Hapi 呈现到 server 实例中,可以在之后被任意 route 加载和使用。
主程序
在 app.js 中的内容如下:
-- -------------------- ---- ------- ----- ---- - --------------------- ----- ------ - ----------------- ----- ---- - --------------- ----- ------ - ------------- ----- ------------ ----- ----------- -- ----- ------ - -- ----------------------------------------- ------------------------------------------ -------------------- ----- ------- - -- ---------------------------------------------- ------------------------------------------------ -- ---------------------- - -------------- ------- ------------------------ -------- - ----- - ------ ---- ---- -------- -------- -------- - ------ --------------------- - -- --------- ------- -------------- ---- - -- - ----- -------- ----- -- - ----- ----------------- ------- ---------------------- -------- - ------------ ------------------ - -- ----- ------------------------ ----- -------------- - -------
你可以看到,主要的逻辑都被封装在了我们的方法 start() 中。首先,我们实例化了一个 Hapi 服务器,然后 传入了我们预定义的路由和插件。
在实际的项目中,我们可以改写这部分逻辑,并且可以利用 pm2 等工具进行进程管理。
运行
现在,你可以在命令行中输入以下内容来运行你生成的程序:
npm start
在这个例子中,当你访问 http://localhost:3000/api/health
时,会通过 NATS 发送一条消息,而这条消息可以被后端服务的者监控、许多执行代码的细节都隐藏在了我们的代码之中。
此外,你可以尝试自己去添加其他的路由、扩展你的插件。总结来说,generator-simple-hapi-and-nats-api 为我们提供了一个轻松构建 Web API 的方式,我们可以专注于实现接口自身的逻辑,将更大精力投入项目的应用和进程管理中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005688981e8991b448e4758