使用-TypeScript-开发-HapiJS-应用

初始化 npm 项目yarn init添加依赖yarn add hapi添加开发依赖要在开发中使用 TypeScrip,同时至少需要有一个工具,可以一直监听项目文件的变更,并实时的将变更更新至启动的服务中,我选择使用 Nodemon,首先添加以下几个开发依赖 yarn add typescript -Dyarn add nodemon -D接下来,我们需要为 node 与 hapi 安装类型定义库: yarn add @types/node -Dyarn add @types/hapi -D安装完成之后, package.json 文件看起来像下面这样的: { "name": "hapiserver", "version": "0.0.1", "description": "API server", "main": "index.js", "author": "Your Name", "license": "MIT", "dependencies": { "hapi": "^18.1.0" }, "devDependencies": { "@types/hapi": "^18.0.2", "@types/node": "^12.0.2", "nodemon": "^1.19.0", "typescript": "^3.4.5" }}注意:你的 dependencies 与 devDependencies 配置中,版本号可能与我的不同。配置 TypeScript设计项目文件目录结构在项目的根目录下,创建一个名为 src 的目录,用于包含系统的所有源代码文件,接着,创建一个名为 dist 的目录,用于保存由 typescript 编译后的 javascript 文件。 ...

May 21, 2019 · 2 min · jiezi

hapi框架搭建记录三Joi数据校验和Sequelize数据迁移填充数据

hapi框架,用官网的简介来说就是:Hapi是构建应用程序和服务的丰富框架,它使开发人员能够专注于编写可重用的应用程序逻辑,而不是花时间构建基础设施。用自己的话简单来说,就是个类似express,koa之类的node服务基础框架。此篇博客是在阅读过掘金小册的《基于 hapi 的 Node.js 小程序后端开发实践指南》并实践操作后,以此记录实践过程和踩过的坑。感兴趣读者可支持阅读掘金小册原版的内容。Joi数据校验1.安装joi更多校验规则参考文档:https://www.npmjs.com/package...npm i @hapi/joi2.配合swagger只需要在路由的config配置校验信息,如./routes/test.js 新增多一条测试接口{ method: "GET", path: `/${GROUP_NAME}/get`, handler: (request, h) => { return { data: request.query }; }, config: { tags: ["api", GROUP_NAME], description: "测试get提交", notes: "配置Implementation说明文", validate: { query: { num: Joi.number() .integer() .required() .description("数字") .error(new Error("num参数错误")) } } } },3.swagger接口文档 Sequence的使用1.安装此案例链接mysql数据库,所以安装mysq2npm i sequelize-cli -Dnpm i sequelizenpm i mysql22.使用到的目录和文件├── config # 项目配置目录| ├── config.js # 数据库连接的配置(区分开发/生产环境)| ├── index.js # 暴露部分配置信息给app.js使用├── models # 数据库 model| ├── index.js # 数据库连接的样板代码├── migrations # 数据迁移的目录├── seeders # 数据填充的目录├── .env # 配置3.env配置数据库信息注意需要在本地mysql中创建对应的数据库, 如:hapi_db# 域名配置信息HOST = 127.0.0.1PORT = 3303# MySQL 数据库连接配置信息MYSQL_HOST = 127.0.0.1MYSQL_PORT = 3306MYSQL_DB_NAME = hapi_dbMYSQL_USERNAME = rootMYSQL_PASSWORD = 1234564. 暴露给入口文件使用的数据信息新建./config/index.jsconst { env } = process;module.exports = { host: env.HOST, port: env.PORT};5. 模式model使用新建./config/config.js给后台将要创建的数据库模型model使用的数据信息// 根据环境动态加载数据库配置信息// 本页面内容主要给数据库连接使用(../models/index.js)if (process.env.NODE_ENV == "production") { require("env2")("./.env.prod");} else { require("env2")("./.env");}const { env } = process;module.exports = { development: { username: env.MYSQL_USERNAME, password: env.MYSQL_PASSWORD, database: env.MYSQL_DB_NAME, host: env.MYSQL_HOST, port: env.MYSQL_PORT, dialect: "mysql", operatorsAliases: false }, production: { username: env.MYSQL_USERNAME, password: env.MYSQL_PASSWORD, database: env.MYSQL_DB_NAME, host: env.MYSQL_HOST, port: env.MYSQL_PORT, dialect: "mysql", operatorsAliases: false }};使用sequelize创建表1.数据库的创建sequelize提供创建数据库的命令,但最后还需要自己动手修改数据库格式为utf-8,所以还是手动直接创建方便2.migration创建表创建一个商品表 shops根据以下命令,将会自动创建./migration/2019XXXXXXXXX-create-shops-table.js其实是可以直接在mysql创建表并填写数据,但这里使用migration来创建主要为了留下对表的创建修改等记录,未来有查询依据。就类比记录创建日志。./node_modules/.bin/sequelize migration:create --name create-shops-tablexxxx-crate.shops.table.js"use strict";module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable("shops", { id: { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true }, name: { type: Sequelize.STRING, allowNull: false }, thumb_url: Sequelize.STRING, created_at: Sequelize.DATE, updated_at: Sequelize.DATE }); }, down: (queryInterface, Sequelize) => {face.dropTable("shops"); }};3. 向mysql数据库中创建表在项目根目录下执行命令./node_modules/.bin/sequelize db:migrate成功创建示例 ...

April 28, 2019 · 2 min · jiezi

hapi框架搭建记录二路由改造和生成接口文档

hapi框架,用官网的简介来说就是:Hapi是构建应用程序和服务的丰富框架,它使开发人员能够专注于编写可重用的应用程序逻辑,而不是花时间构建基础设施。用自己的话简单来说,就是个类似express,koa之类的node服务基础框架。此篇博客是在阅读过掘金小册的《基于 hapi 的 Node.js 小程序后端开发实践指南》并实践操作后,以此记录实践过程和踩过的坑。感兴趣读者可支持阅读掘金小册原版的内容。路由汇总1. 在./routes目录下新建index.js作为路由的汇总,这样以后只管在./routes下新建文件即可"use strict";const fs = require("fs");const path = require("path");const basename = path.basename(__filename); // 当前文件名let routeArr = [];// 同步读取当前目录,并过滤除了当前文件的文件名数组fs.readdirSync(__dirname) .filter(file => { // 过滤掉隐藏文件、当前文件、非js文件, 返回当前目录下文件名称数组 return ( file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js" ); }) .forEach(file => { // 引入路由模块 let arr = require(path.join(__dirname, file)); // 汇总 routeArr.push(...arr); });module.exports = routeArr;测试路由1.新建test.js文件作为测试const GROUP_NAME = "test";module.exports = [ // 纯测试返回 接口 { method: "GET", path: `/${GROUP_NAME}`, handler: (request, h) => { const data = { message: "test" }; // 响应数据方式: // return h.response(data).code(200); return data; } },]2.修改app.js ...

April 28, 2019 · 1 min · jiezi

hapi框架搭建记录一初始化项目

hapi框架,用官网的简介来说就是:Hapi是构建应用程序和服务的丰富框架,它使开发人员能够专注于编写可重用的应用程序逻辑,而不是花时间构建基础设施。用自己的话简单来说,就是个类似express,koa之类的node服务基础框架。此篇博客是在阅读过掘金小册的《基于 hapi 的 Node.js 小程序后端开发实践指南》并实践操作后,以此记录实践过程和踩过的坑。感兴趣读者可支持阅读掘金小册原版的内容。第一个helloworld1.在新建项目目录中初始化配置文件npm init2.安装hapinpm i hapi3.全局安装热部署工具supervisor(类似nodemon)npm install supervisor -g4.新建app.js,可从官网案例中抄示例代码'use strict';const Hapi = require('hapi');const init = async () => { const server = Hapi.server({ port: 3000, host: 'localhost' }); server.route({ method: 'GET', path:'/', handler: (request, h) => { return 'Hello World!'; } }); await server.start(); console.log('Server running on %ss', server.info.uri);};process.on('unhandledRejection', (err) => { console.log(err); process.exit(1);});init();5.终端运行项目 6.浏览器测试效果 目录结构划分 (PS: 根据需要可以将业务逻辑代码再划分到controllers层)├── config # 项目配置目录├── logs # 输出日志├── migrations # 创建数据库文件├── models # 数据库 model├── node_modules # node.js 的依赖目录├── plugins # 插件目录├── routes # 路由目录├── seeders # 初始化表数据文件├── test # 测试类├── utils # 工具类相关目录├── .env # 配置文件├── app.js # 项目入口文件├── package.json # JS 项目工程依赖库├── readme.md # 项目工程如何被使用的说明手册配置全局环境信息1. env配置示例配置env的意义在于,不同的环境下域名数据库等信息不一定一致,通过配置手段加载读取更灵活。同时全局环境直接获取。# 域名配置信息HOST = 127.0.0.1PORT = 3303# MySQL 数据库连接配置信息MYSQL_HOST = 127.0.0.1MYSQL_PORT = 3306MYSQL_DB_NAME = database_nameMYSQL_USERNAME = database_usernameMYSQL_PASSWORD = database_password# JWT 自定义secretJWT_SECRET = your_secret# 微信小程序配置WX_APPID = your-app-id # 微信小程序appidWX_SECRET = your-secret # 微信小程序密码WX_MCHID = your-mchid # 支付商户号WX_PAY_API_KEY = your-pay-api-key # 微信支付的 api key2.安装env2通过此依赖可在js代码中直接读取.env配置的参数信息(如:读取端口号 process.env.PORT)npm i env23.示例获取 ...

April 28, 2019 · 1 min · jiezi

如何选择正确的Node框架ExpressKoa还是Hapi

简介Node.js是10年前首次推出的,目前它已经成为世界上最大的开源项目,在GitHub上有+59,000颗星,下载次数超过10亿。流行度快速增长的部分原因是Node.js允许开发人员在应用程序的客户端和服务器端部分使用相同的语言:JavaScript。Node.js是一个开源和跨平台的JavaScript运行时环境,专为构建可扩展的服务器端WEB应用而设计,自身具有高并发、扩展性强等特点。由于社区其呈指数级增长和普及,因此创建了许多框架来提高生产力。在本文中,我们将探讨Node.js中三个最流行的框架之间的差异:Express,Koa和Hapi。在以后的文章中,我们将研究Next,Nuxt和Nest。比较基于: GitHub Stars和npm下载安装基本的Hello World应用程序好处缺点性能安全社区参与ExpressExpress是一个最小且灵活的Web应用程序框架,为Web和移动应用程序提供了一组强大的功能,它的行为就像一个中间件,可以帮助管理服务器和路由star GitHub star:+43,000npm每周下载 6,881,035安装 确保你已经安装node和npm // 你可以将express安装到项目依赖 npm install express --save // 如果要临时安装Express而不是将其添加到依赖项列表,则可以使用 npm install express --no-saveHello World 这是关于如何创建一个侦听端口3000并响应“Hello World!”的快速应用程序的最基本示例 // 这里只创建根目录 其他目录返回404 const express = require('express') const app = express() const port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`))好处 几乎是Node.js Web中间件的标准简单,简约,灵活和可扩展快速开发应用程序完全可定制学习曲线低轻松集成第三方服务和中间件主要关注浏览器,模板和渲染集成开箱即用缺点 尽管Express.js是一个非常方便且易于使用的框架,但它有一些可能影响开发过程的小缺点。组织需要非常清楚,以避免在维护代码时出现问题随着代码库大小的增加,重构变得非常具有挑战性需要大量的手工劳动,因为您需要创建所有端点性能 Express是对web应用的一层基本封装,继承了Node.js的特性当天也有一些express性能的最佳实践包括: 使用gzip压缩不要使用同步功能正确记录(用于调试,使用特殊模块,如调试,应用程序活动使用winston或bunyan)使用try-catch或promises正确处理异常确保您的应用程序使用流程管理器自动重新启动,或使用systemd或upstartinit等系统在群集中运行您的应用。您可以通过启动进程集群来大大提高Node.js应用程序的性能缓存请求结果,以便您的应用不会重复操作以反复提供相同的请求使用负载均衡器运行它的多个实例并分配流量,如Nginx或HAProxy对静态资源使用反向代理。它可以处理错误页面,压缩,缓存,提供文件和负载平衡等更多性能最佳实践一个简单的“Hello World”应用程序每秒具有以下性能请求: 安全 Node.js漏洞直接影响Express,因此确保使用最新的稳定版Node.js查看express 最佳安全实践社区参与 贡献者数量:220Pull Requests:821Express社区定期活动包括 Gitter,IRC channel, issues, Wiki等等最后,express可能是Node.js最流行的框架,还有许多其他流行的框架都是基于Express构建的。koaKoa 是一个新的 web 框架,由 Express幕后的原班人马打造,致力于成为web应用和API开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa帮你丢弃回调函数,并有力地增强错误处理Koa并没有捆绑任何中间件而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序star ...

April 24, 2019 · 1 min · jiezi

小程序开发二使用hapi快速开发接口

上篇文章中,我们介绍了数据采集相关的知识,这篇文章中,我们来整理下nodejs开发后台常用的库,然后选择hapi来进行restful API的开发,以及定时任务、RPC的使用。nodejs主流框架介绍我们先来看下目前nodejs主流的框架: 1. Express(43.4k)对于一个已经在使用nodejs的开发人员来说,Express并不是一个新鲜事,它提供了对nodejs原始API的比较好的封装,从而使开发者更加容易使用nodejs。 2. Meteor(41k)Meteor也是一个很出色的框架,记得官网有一句话,“Ship more with less code”, 确实也是像这句话一样,不管是服务器数据库的访问,业务逻辑实现,还是客户端的展示,所有的流程都是开箱即用的。还有一个点应该是 “配置大于开发”的思想,很多东西都是可以直接通过配置来实现,不需要太多的代码,这点我觉得也是这个框架很厉害的一个点。 3. Koa(25.8k)Koa是express的原班人马开发的,核心是ES6的generator,使用generator来实现中间件的流程控制,在Koa框架中就再不会看到复杂的callback了。框架本身非常小,只打包了一些必要的功能,但是它本身通过良好的模块化组织,让使用者可以按照自己的想法来实现一个扩展性非常好的应用。 4. sails(20.4k)Sails在底层使用express来提供对http请求的处理,同时使用Socket.IO框架来处理websocket请求,也通过waterline框架实现了ORM功能,你的应该程序可以在不进行大的修改的前提下,就可以从一个后端数据库,切换到另外后端数据库(也可以是一个NoSQL数据库)。 5. egg(12.4k)egg是阿里的一个团队,基于Koa开发的框架,奉行【约定优于配置】,按照一套统一的约定进行应用开发,插件机制也比较完善,也是很好用的。之前写的微博词云的api就是用egg来写的,http://zz.mcust.cn,这个网站也是egg来写的。 6.hapi(11k)Hapi在众多的框架中并非一个老牌选手,然而他却成功的在这当中创造了自己的一个生态圈。致力于完全的分离node HTTP服务器,路由以及业务逻辑,并更多的聚焦于如何尽可能的通过配置而非代码来控制东西。 这次选择Hapi的原因其实也很简单,因为之前没用过。 使用Hapi每一次学习一个东西,其实套路都是差不多的,我们先去官网看看。 这里我们有很多的关键点,有更新信息,指南说明,api文档,插件,版本号,最近更新时间,下载次数,源码等等信息。看更新时间和下载次数看来,活跃人数还是比较多的,这些数据也能从某个维度上来对一个框架的做一些评判。 然后进入tutorials,照着里面的教程动手实践一下,学习如何创建http服务,如何使用路由,获取url参数,cookies,日志、验证、视图等等。 下面就正式进入小程序的接口开发中 创建项目,项目文件目录大致如下: models代表数据模型,我在里面定义了sequelize的模型,数据结构;controllers里边是大部分的业务逻辑;routers里边定义了路由,以及参数的验证,处理路由的方法等;common里面定义了公共的一些方法,一些加密的方法,生成uuid的方法等;config里面是项目数据库配置和插件配置;log是放日志文件的地方。 然后我们这里也用了很多的插件,和一些工具包等来帮助我们更快地完成任务。 这块其实比较重要的一点是热部署,开发环境中,使用了supervisor来部署;而生产环境我们是用了pm2来部署。 下面我们来看下hapi中如何使用定时任务 我们先看看hapi有没有已经有的定时任务工具,我们去官网插件里搜一下“cron”, 发现是有的,那我们就直接用hapi-cron这个库即可。 需要先配置下定时任务: 然后注入到服务中即可。 上面的配置表示每天的6点、11点、16点、23点回去请求/spider_articles这个请求。对cron表达式不熟悉的同志们可以稍微补补这方面的知识。 然后这个接口里是发送了三个请求,是我们上次部署好的爬虫服务。 这样我们就通过定时任务完成了定时去爬数据的工作。 别的接口都是比较正常的,需要操作下数据库即可,还有一部分是需要rpc的,也是比较简单好理解的,在这里就不细谈了。 本节关于hapi的部分到这里就结束了。 NEXT下一篇,我们会介绍小程序的开发,mpvue,以及小程序原始组件的使用,还有小程序一些重要的配置等。

April 24, 2019 · 1 min · jiezi

基于 hapi 的博客系统 api

???? hapiblog 博客 api基于 hapi 框架的博客系统,使用 jwt 鉴权,支持用户注册和登录,获取文章列表和文章详情。以 redis 作为缓存解决方案,使用 mysql 数据库和 sequelize 处理数据持久化。???? DEMO点击这里查看DEMO???? 支持的功能分页获取博客文章列表增查改删博客文章根据标签、标题和作者 ID 筛选文章获取文章排行列表支持 30 天以内的文章阅读量排行使用 redis 缓存请求的数据用户的注册和登录以及 JSON WebToken 的鉴权通过 swagger 创建 API 文档使用 hapi-good 日志工具使用 sequelize 创建数据迁移???? 使用方法???? clonegit clone https://github.com/oliyg/hapiblog.git???? 配置环境变量根目录新增 .env 文件,仿照 .env.example 配置环境变量:# serverHOST = HOSTPORT = PORT # mysqlMYSQL_USERNAME = MYSQL_USERNAMEMYSQL_PASSWORD = MYSQL_PASSWORDMYSQL_DB_NAME = MYSQL_DB_NAMEMYSQL_HOST = MYSQL_HOSTMYSQL_PORT = MYSQL_PORT # redisREDIS_HOST = REDIS_HOSTREDIS_PORT = REDIS_PORT # jwtJWT_SECRET = JWT_SECRET # passwd encrypt secretPASSWD_SECRET = PASSWD_SECRET???? 数据迁移开启 mysql 服务,并执行命令:npm run createdb:dev 创建数据库npm run createtable 创建数据库表npm run initdata 创建示例数据npm run start 开启服务✈️ 启动服务访问 http://127.0.0.1:8000/documentation#/ 查看 API 文档 ...

October 9, 2018 · 1 min · jiezi