hapi mysql项目实战路由初始化_hapi框架搭建记录(三):Joi数据校验和Sequelize(数据迁移、填充数据)...

这篇博客记录了使用hapi框架进行MySQL项目实战的过程,包括Joi数据校验、Swagger接口文档的配置以及Sequelize进行数据迁移和填充数据的步骤。通过配置路由、数据验证以及数据库模型,实现了服务端的基础功能。

35657c8a10c9f3172dbe899ebf23d4d3.png

hapi框架,用 官网 的简介来说就是:Hapi是构建应用程序和服务的丰富框架,它使开发人员能够专注于编写可重用的应用程序逻辑,而不是花时间构建基础设施。

用自己的话简单来说,就是个类似express,koa之类的node服务基础框架。

此篇博客是在阅读过掘金小册的 《基于 hapi 的 Node.js 小程序后端开发实践指南》 并实践操作后,以此记录实践过程和踩过的坑。感兴趣读者可支持阅读掘金小册原版的内容。

Joi数据校验

npm i @hapi/joi

2.配合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接口文档

ccebff365e25835d9dceeb0f8b09bebd.png

Sequence的使用

1.安装

此案例链接 mysql 数据库,所以安装mysq2

npm i sequelize-cli -D

npm i sequelize

npm i mysql2

2.使用到的目录和文件

├── config # 项目配置目录

| ├── config.js # 数据库连接的配置(区分开发/生产环境)

| ├── index.js # 暴露部分配置信息给app.js使用

├── models # 数据库 model

| ├── index.js # 数据库连接的样板代码

├── migrations # 数据迁移的目录

├── seeders # 数据填充的目录

├── .env # 配置

3.env配置 数据库 信息

注意需要在本地mysql中创建对应的数据库, 如:hapi_db

# 域名配置信息

HOST = 127.0.0.1

PORT = 3303

# MySQL 数据库连接配置信息

MYSQL_HOST = 127.0.0.1

MYSQL_PORT = 3306

MYSQL_DB_NAME = hapi_db

MYSQL_USERNAME = root

MYSQL_PASSWORD = 123456

4. 暴露给入口文件使用的数据信息

新建./config/index.js

const { 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

}

};

1.数据库的创建

sequelize提供创建数据库的命令,但最后还需要自己动手修改数据库格式为utf-8,所以还是手动直接创建方便

2.migration创建表

创建一个商品表 shops

根据以下命令,将会自动创建./migration/2019XXXXXXXXX-create-shops-table.js

其实是可以直接在mysql创建表并填写数据,但这里使用migration来创建主要为了留下对表的创建修改等记录,未来有查询依据。就类比记录创建日志。

./node_modules/.bin/sequelize migration:create --name create-shops-table

xxxx-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

成功创建示例

fa720d3ecfe87b1bb4f10a0de459d136.png

可能报错情况1:

1ea755bce1c858fa755d3f1f043c2eaa.png

解决:查看config/config.js配置是否正确,并注释掉operatorsAliases: false

可能报错情况2:

138a592ba5cf710619bd661085205a66.png

解决:mysql数据库没有设置密码,注释掉配置文件(config/config.js)password: env.MYSQL_PASSWORD,

数据库表成功插件

da7abd96967a56a3904fbc2dbfd1715a.png

使用Sequelize填充表数据

1.在项目根目录下执行命令:

将自动创建 /seeders/2019XXXX-init-shops.js

./node_modules/.bin/sequelize seed:create --name init-shops

2. 编写要填充的数据 xxxx-init-shops.js

"use strict";

/**

* 初始化 店铺 数据

* 若 数据库表中存在created_at和updated_at此两个字段,将默认由Sequelize维护

*/

const timestamps = {

created_at: new Date().toLocaleString(),// 解决时差问题,使用toLocaleString()

updated_at: new Date().toLocaleString()

};

module.exports = {

up: (queryInterface, Sequelize) => {

return queryInterface.bulkInsert(

"shops",

[

{ id: 1, name: "店铺1", thumb_url: "1.png", ...timestamps },

{ id: 2, name: "店铺2", thumb_url: "2.png", ...timestamps },

{ id: 3, name: "店铺3", thumb_url: "3.png", ...timestamps },

{ id: 4, name: "店铺4", thumb_url: "4.png", ...timestamps }

],

{}

);

},

down: (queryInterface, Sequelize) => {

// 删除shop表id为1,2,3,4的数据

const { Op } = Sequelize;

return queryInterface.bulkDelete(

"shops",

{ id: { [Op.in]: [1, 2, 3, 4] } },

{}

);

}

};

3.执行填充

./node_modules/.bin/sequelize db:seed:all

执行效果和数据结果

753e4bb1910cd666e8ccacd5dacc19b9.png

889d9fc9e5df9a893bac0c8feb30a574.png

目录结构

截止目前为止,目录结构和文件如下:

1b3043e71f4b18f85cfd0afaee286cf3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值