koa2+sequelize+mysql+pm2,支持node webpack打包,線上部署日誌查詢

簡介

  • koa2 做爲主要node service 入口
  • webpack 打包node 環境
  • pm2 服務負載均衡
  • mysql 數據庫
  • mysql 強大的事務 sequelize
  • koa-body,文件上傳中間件
  • koa-cors koa 跨域中間件
  • validator 參數校驗器自動返回 JSON message和key
  • log4 日誌輸出
    ......

項目獨立提供服務接口,可做爲先後端分類提供良好的解決方案vue

依賴

node -v 8.4.0
npm -v 5.3.0
npm2 -v 3.5.1

目錄

.
├─auto //sequelize-auto 自動生成 models實體類
└─src
    |  main.js   //入口文件
    |  router.js  // controller 入口
    |
    ├─config    //配置文件
    ├─controller  //api層
    ├─models     // 實體類
    ├─utils     //工具類
    └─validator //參數校驗器

安裝

git https://github.com/shanyanwt/koa_vue_blog.git
    npm install
    開發環境
    npm run dev
        localhost:8081
    生產環境
    npm run build  //生成app.js
    npm run pm2
        localhost:8081

supervisor nodejs 熱加載 開發環境使用

supervisor -w src ,添加須要監聽的文件,默認是所有可是有時不起做用,加上監聽的文件便可node

建立數據庫鏈接

sequelize 鏈接mysql
sequelize 安裝
    $> npm i sequelize mysql mysql2 --save-dev
建立鏈接
var Sequelize = require('sequelize');
    var sequelize = new Sequelize(dbName, dbUser, dbPas, {
        host: dbHost,
        dialect: 'mysql',
        pool: {
            max: 5,
            min: 0,
            idle: 10000
        },
        define: {
            timestamps: false //關閉時間戳
        }
    })
       //測試鏈接
    sequelize.authenticate().then(() => {
        // 鏈接成功
    }).catch(err => {
         //在這裏能夠添加郵箱通知
    });
  • sequelize wikimysql

    方法名 屬性 返回結果
    create 添加 return 所添加信息 Object
    bulkCreate 批量添加 return 所添加信息 Array
    findOne 查詢單條 return Object
    findByPk 根據主鍵查詢 return Object
    findAll 查詢 return Array
    findAndCountAll 分頁查詢 return Object -> count:Number,rows:Array
    update 更新 return 1 or 0 Number
    destroy 刪除 return 1or 0 Number
    max('age') 計算最大 return Object
    min('age') 計算最小 return Object
    sum('age') 計算總和 return Object
    count 查詢條數 return 1or 0 Number
    query 原始sql查詢 return Object
  • sequelize屬性方法 wikiwebpack

    方法名 屬性 備註
    attributes:['id'] 包含條件查詢 只查詢id
    db.literal('star_number +1') 自定義字符 不會轉義,可做爲sql執行
    db.transaction 事物處理 可對批量操做進行事物處理,失敗自行pormise處理或者 throw new Error(), 自行回滾

ps: db是從modes中導出已鏈接庫的sequelizegit

models生成 sequelize-auto 插件

models生成 可在auto 目錄中執行密令
1. 進入 auto文件夾輸入 
    $ node auto.js
2. 執行完 auto.js 會生成models及表實體類而且導出爲index.js
auto.js文件所執行命令,也可手動在終端輸入此命令
sequelize-auto -h "數據庫地址" -d "數據庫名" -u "用戶名" -x "密碼" -p "端口號"  --dialect mysql -o "生成文件的路徑"

LinValidator 參數校驗器

自定校驗傳入參數是否正確,錯誤將會返回錯誤 JSON message和keygithub

1.userValidator.jsweb

引入
const {
    XValidator,
    Rule
} = require('../validator/validator.js');

/* 
    模擬用戶註冊規則
 */

class RegisterValidator extends LinValidator {
    constructor() {
        super();
        //鏈式校驗規則
        this.name = [
            new Rule('isNotEmpty', '暱稱不可爲空'),
            new Rule('isLength', '暱稱長度必須在2~10之間', 2, 10)
        ];
        this.email = [
            new Rule('isOptional'),
            new Rule('isEmail', '電子郵箱不符合規範,請輸入正確的郵箱')
        ];
        this.password = [
            // 自定義matches 方法
            new Rule(
                'matches',
                '密碼長度必須在6~22位之間,包含字符、數字和 _ ',
                /^[A-Za-z0-9_*&$#@]{6,22}$/
            )
        ];
        this.confirm_password = new Rule('isNotEmpty', '確認密碼不可爲空');
    }
    /* 
        自定義 calidate 校驗規則
        必須以 calidate開頭的一個方法, data是傳入參數
         成功是 返回true
         錯誤 ConfirmPassword 
     */
    validateConfirmPassword(data) {
        if (!data.body.password || !data.body.confirm_password) {
            return [false, '兩次輸入的密碼不一致,請從新輸入'];
        }
        let ok = data.body.password === data.body.confirm_password;
        if (ok) {
            return ok;
        } else {
            return [false, '兩次輸入的密碼不一致,請從新輸入'];
        }
    }
}
module.exports = {
    RegisterValidator
};
  1. user.js
const {
    RegisterValidator
} = require('./userValidator.js');


const testRegister = async ctx => {
    //調用 RegisterValidator 
    // 校驗合法繼續向下走 ,不可發則拋出異常 throw Error()
    const v = await new RegisterValidator().validate(ctx);
    /* v  返回 body, query ,params,header請求參數 
         鏈式取值 能夠防止多層對象無結值的錯誤
     */
     // post取值
    var  name =  v.get('body.user.index.items.name')
    //  get取值
    var getName = v.get('query.name') 
    /**.不合法將會返回
        {
                "error_code": 20001,
                "error_message": {
                    "name": "暱稱不可爲空",
                    "password": "密碼長度必須在6~22位之間,包含字符、數字和 _ ",
                    "confirm_password": "確認密碼不可爲空",
                    "ConfirmPassword": "兩次輸入的密碼不一致,請從新輸入"
                }
            }
    */
}

生產環境部署 pm2 配置

生產環境 centos 7 以及上述全部依賴
全局安裝  npm install pm2 -g 
    $ pm2 -v
    > 3.5.1
    配置 pm2.conf.json
    打印日誌輸出文件
    "out_file": "./out.log",
    "error_file": "./out.log"
    "instances": 2  //打開多任務做爲負載均衡

生產部署步驟

  1. build 生成app.js webpack打包方案sql

    npm run build
  2. 上傳服務器文件

    image

  3. 安裝依賴數據庫

    npm install
  4. pm2 服務部署npm

    $ npm run pm2       //啓動服務
    ps: 確保已安裝,上述依賴 $ npm install pm2 -g

    image

    $ pm2 list //查看已運行服務
    image

    $pm2 logs //查看服務日誌

    image

    $ pm2 stop 0 //中止響應的進程

    ps: 在此服務已經發布完成,能夠根據服務器 ip:8081調用,在次更新只需把打好的app.js上傳服務器,重啓便可

我是一隻孤獨的狼......歡迎star

相關文章
相關標籤/搜索