本文作者:问几许

使用 Hapi 开发 APIs(二)

问几许 3年前 ( 2019-11-22 ) 1967 抢沙发
使用 Hapi 开发 APIs(二)摘要: 结构化项目在上一篇文章中,我们搭建了一个基础API服务,讲所有的代码信息都集中在了一个文件中,在项目规模扩大之后会加大开发、维护的难度。项目工程化设计原则:1、单业务模块化大多数的...

结构化项目

在上一篇文章中,我们搭建了一个基础API服务,讲所有的代码信息都集中在了一个文件中,在项目规模扩大之后会加大开发、维护的难度。


项目工程化设计原则:

1、单业务模块化

大多数的内务需求,都最终可以被归纳进单个模块,模块与模块间具有物理文件独立性,能更好地便于多人的项目团队人员同时维护代码。

2、模块二百行原则

二百行是个虚数泛指,但也在大量的项目实践后发现,大多数单文件的模块代码,在良好的设计规划下,往往很难突破两百行的数目,而两百行内的代码的阅读与维护,也都是一个心理压力较小的量级。

正所谓合久必分,单个模块的代码量大量增长,可以考虑分离部分代码到外部文件来管理,通过模块 require 的方式形成关联,以保持各模块代码的相对精简与可维护性。

3、同类模块分组化

分组在本文中一般指形成一个文件目录,来对一些功能相似的业务模块形成管理,比如常见的路由模块,会有大量不同的基于 resource 的资源路由,被分离在单个模块文件中,最终汇总在 router 的目录。再比如定义数据库表结构映射关系的 model 模型类模块,最终也往往会习惯汇总到一个 model 的目录中,形成统一管理。

4、配置文件分离

系统中往往会存在一些诸如服务启动的端口号、服务名称、数据库连接配置、服务启动的性能参数域值配置等等,这些参数的业务逻辑往往离散在系统中的各个独立模块中,将其抽取在一个统一的类似 config.js 的配置文件中进行整体管理,可以避免日后打地鼠式的在模块中四处找寻,以及修改编辑疏漏。

基于上述原则,我们就基础项目工程进行拆分重构。


重构步骤:

1、项目目录

├── config                       # 项目配置目录
│    ├── index.js                 # 配置项目中的配置信息
├── models                       # 数据库 model
├── node_modules                     # node.js 的依赖目录
├── plugins                      # 插件目录
├── routes                       # 路由目录
│    ├── hello-world.js               # 测试接口 hello-world
├── utils                        # 工具类相关目录
├── app.js                       # 项目入口文件
├── package.json                     # JS 项目工程依赖库
├── readme.md                    # 项目工程如何被使用的说明手册


2、分离路由

// routes/hello-hapi.js
module.exports = [
    {
        method: 'GET',
        path: '/',
        handler: (request, h) => {
            return 'Hello, Hapi!!!!!!!';
        }
    },
   
   {
        method: 'GET',
        path: '/api/welcome',
        handler() {
            return {
                code: 200,
                success: true,
                data: {
                    msg: 'welcome'
                }
            }
        }
   }
]


3、分离config

// config/index.js

module.exports = {
    host: '127.0.0.1',
    port: 3000,
}


4、关联 config 与 route 路由模块

// app.js
const Hapi = require('hapi');
const config = require('./config');
const routesHelloHapi = require('./routes/hello-hapi');

const server = Hapi.server({
  port: config.port,
  host: config.host,
});

server.route([
  ...routesHelloHapi
]);

const init = async () => {
  await server.start();
  console.log(`Server running at: ${server.info.uri}`);
};

process.on('unhandledRejection', (err) => {
  console.log(err);
  process.exit(1);
});

init();


5、环境配置

引入一个被 .gitignore 的 .env 的文件,以 key-value 的方式,记录系统中所需要的可配置环境参数。并同时配套一个.env.example 的示例配置文件用来放置占位,.env.example 可以放心地进入 git 版本仓库。

# .env.expamle

# 服务的启动名字和端口,但也可以缺省不填值,默认值的填写只是一定程度减少起始数据配置工作
HOST = 127.0.0.1PORT = 3000

最后复制出一个真实的 .env 文件,供项目使用

# .env

# 服务的启动名字和端口,但也可以缺省不填值,默认值的填写只是一定程度减少起始数据配置工作
HOST = 127.0.0.1PORT = 3000


读取环境配置:

Node.js 可以通过 env2 的插件,来读取 .env 配置文件,加载后的环境配置参数,可以通过例如  process.env.POST 来读取端口信息。

# 安装
npm i env2
// app.js

require('env2')('./.env')

修改config/index.js

// config/index.js
const { env } = process;module.exports = {
  host: env.host,
  port: env.port,  
}


文章版权及转载声明

作者:问几许本文地址:https://wenjixu.com/blog/138.html发布于 3年前 ( 2019-11-22 )
文章转载或复制请以超链接形式并注明出处问几许

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,1967人围观)参与讨论

还没有评论,来说两句吧...