- hapi框架,用官網的簡介來講就是:Hapi是構建應用程序和服務的豐富框架,它使開發人員可以專一於編寫可重用的應用程序邏輯,而不是花時間構建基礎設施。
- 用本身的話簡單來講,就是個相似express,koa之類的node服務基礎框架。
- 此篇博客是在閱讀過掘金小冊的《基於 hapi 的 Node.js 小程序後端開發實踐指南》並實踐操做後,以此記錄實踐過程和踩過的坑。感興趣讀者可支持閱讀掘金小冊原版的內容。
1.安裝joi
更多校驗規則參考文檔:https://www.npmjs.com/package...
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接口文檔
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
成功建立示例
可能報錯狀況1:
解決:查看config/config.js配置是否正確,並註釋掉operatorsAliases: false
可能報錯狀況2:
解決:mysql數據庫沒有設置密碼,註釋掉配置文件(config/config.js)password: env.MYSQL_PASSWORD,
數據庫表成功插件html
使用Sequelize填充表數據node
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
執行效果和數據結果
截止目前爲止,目錄結構和文件以下: