hapi框架搭建記錄(三):Joi數據校驗和Sequelize(數據遷移、填充數據)

圖片描述

  • hapi框架,用官網的簡介來講就是:Hapi是構建應用程序和服務的豐富框架,它使開發人員可以專一於編寫可重用的應用程序邏輯,而不是花時間構建基礎設施。
  • 用本身的話簡單來講,就是個相似express,koa之類的node服務基礎框架。
  • 此篇博客是在閱讀過掘金小冊的《基於 hapi 的 Node.js 小程序後端開發實踐指南》並實踐操做後,以此記錄實踐過程和踩過的坑。感興趣讀者可支持閱讀掘金小冊原版的內容。

Joi數據校驗

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接口文檔

clipboard.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
  }
};

使用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-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

成功建立示例

clipboard.png

可能報錯狀況1:

clipboard.png

解決:查看config/config.js配置是否正確,並註釋掉operatorsAliases: false

可能報錯狀況2:

clipboard.png

解決:mysql數據庫沒有設置密碼,註釋掉配置文件(config/config.js)password: env.MYSQL_PASSWORD,

數據庫表成功插件html

clipboard.png

使用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

執行效果和數據結果

clipboard.png

clipboard.png

目錄結構

截止目前爲止,目錄結構和文件以下:

clipboard.png

相關文章
相關標籤/搜索