koa2+sequelize+mysql+pm2,支持node webpack打包

簡介

  • koa2 作為主要node service 入口

  • webpack 打包node 環(huán)境

  • pm2 服務(wù)負(fù)載均衡

  • mysql 數(shù)據(jù)庫

  • sequelize 強大的事務(wù) mysql

  • koa-body,文件上傳中間件

  • koa-cors koa 跨域中間件

  • validator 參數(shù)校驗器自動返回 JSON message和key

  • log4 日志輸出

    ......

依賴

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     // 實體類
    ├─test     // 測試類
    ├─utils     // 工具類
    └─validator //參數(shù)校驗器
    

部署

    git https://github.com/shanyanwt/koa_vue_blog.git
    npm install
    開發(fā)環(huán)境
    npm run dev
        localhost:8081
    生產(chǎn)環(huán)境
    npm run build  //生成app.js
    npm run pm2
        localhost:8081

supervisor nodejs 熱加載 開發(fā)環(huán)境使用

supervisor -w src ,添加需要監(jiān)聽的文件,默認(rèn)是全部但是有時不起作用,加上監(jiān)聽的文件即可

創(chuàng)建數(shù)據(jù)庫連接

sequelize 連接mysql

    sequelize 安裝
    $> npm i sequelize mysql mysql2 --save-dev

創(chuàng)建連接

    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 //關(guān)閉時間戳
        }
    })
    //測試連接
    sequelize.authenticate().then(() => {
        // 連接成功
    }).catch(err => {
         //在這里可以添加郵箱通知
    });
    
  • sequelize wiki

    方法名 屬性 返回結(jié)果
    create 添加 return 所添加信息 Object
    bulkCreate 批量添加 return 所添加信息 Array
    findOne 查詢單條 return Object
    findByPk 根據(jù)主鍵查詢 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 查詢條數(shù) return 1or 0 Number
    query 原始sql查詢 return Object
  • sequelize屬性方法 wiki

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

ps: db是從modes中導(dǎo)出已連接庫的sequelize

models生成 sequelize-auto 插件

models生成 可在auto 目錄中執(zhí)行密令

1. 進(jìn)入 auto文件夾輸入 
    $ node auto.js
2. 執(zhí)行完 auto.js 會生成models及表實體類并且導(dǎo)出為index.js 

auto.js文件所執(zhí)行命令,也可手動在終端輸入此命令

   sequelize-auto -h "數(shù)據(jù)庫地址" -d "數(shù)據(jù)庫名" -u "用戶名" -x "密碼" -p "端口號"  --dialect mysql -o "生成文件的路徑"

LinValidator 參數(shù)校驗器

自定校驗傳入?yún)?shù)是否正確,錯誤將會返回錯誤 JSON message和key

1.userValidator.js

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

/* 
    模擬用戶注冊規(guī)則
 */

class RegisterValidator extends LinValidator {
    constructor() {
        super();
        //鏈?zhǔn)叫r炓?guī)則
        this.name = [
            new Rule('isNotEmpty', '昵稱不可為空'),
            new Rule('isLength', '昵稱長度必須在2~10之間', 2, 10)
        ];
        this.email = [
            new Rule('isOptional'),
            new Rule('isEmail', '電子郵箱不符合規(guī)范,請輸入正確的郵箱')
        ];
        this.password = [
            // 自定義matches 方法
            new Rule(
                'matches',
                '密碼長度必須在6~22位之間,包含字符、數(shù)字和 _ ',
                /^[A-Za-z0-9_*&$#@]{6,22}$/
            )
        ];
        this.confirm_password = new Rule('isNotEmpty', '確認(rèn)密碼不可為空');
    }
    /* 
        自定義 calidate 校驗規(guī)則
        必須以 calidate開頭的一個方法, data是傳入?yún)?shù)
         成功是 返回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 => {
    //調(diào)用 RegisterValidator 
    // 校驗合法繼續(xù)向下走 ,不可發(fā)則拋出異常 throw Error()
    const v = await new RegisterValidator().validate(ctx);
    /* v  返回 body, query ,params,header請求參數(shù) 
         鏈?zhǔn)饺≈?可以防止多層對象無結(jié)值的錯誤
     */
     // 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位之間,包含字符、數(shù)字和 _ ",
                    "confirm_password": "確認(rèn)密碼不可為空",
                    "ConfirmPassword": "兩次輸入的密碼不一致,請重新輸入"
                }
            }
    */
}

生產(chǎn)環(huán)境部署 pm2 配置

生產(chǎn)環(huán)境 centos 7 以及上述所有依賴

    全局安裝  npm install pm2 -g 
    $ pm2 -v
    > 3.5.1
    配置 pm2.conf.json
    打印日志輸出文件
    "out_file": "./out.log",
    "error_file": "./out.log"
    "instances": 2  //打開多任務(wù)作為負(fù)載均衡

生產(chǎn)部署步驟

  1. build 生成app.js

     npm run build
    
  2. 上傳服務(wù)器文件

    項目目錄
  3. 安裝依賴

     npm install
    
  4. pm2 服務(wù)部署

    $ npm run pm2       //啟動服務(wù)
    ps: 確保已安裝,上述依賴 $ npm install pm2 -g 
    
    pm2進(jìn)程表

    $ pm2 list //查看已運行服務(wù)


    pm2進(jìn)程表

    $pm2 logs //查看服務(wù)日志

    pm2日志

    $ pm2 stop 0 //停止響應(yīng)的進(jìn)程

    ps: 在此服務(wù)已經(jīng)發(fā)布完成,可以根據(jù)服務(wù)器 ip:8081調(diào)用,在次更新只需把打好的app.js上傳服務(wù)器,重啟即可

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容