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

簡介

  • koa2 作為主要node service 入口

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

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

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

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

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

  • koa-cors koa 跨域中間件

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

  • log4 日志輸出

    ......

依賴

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

目錄

.
├─auto //sequelize-auto 自動生成 models實(shí)體類
└─src
    |  main.js   //入口文件
    |  router.js  // controller 入口
    |
    ├─config    //配置文件
    ├─controller  //api層
    ├─models     // 實(shí)體類
    ├─test     // 測試類
    ├─utils     // 工具類
    └─validator //參數(shù)校驗(yàn)器
    

部署

    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') 計(jì)算最大 return Object
    min('age') 計(jì)算最小 return Object
    sum('age') 計(jì)算總和 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及表實(shí)體類并且導(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)器

自定校驗(yàn)傳入?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?yàn)規(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 校驗(yàn)規(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 
    // 校驗(yàn)合法繼續(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ù)器文件

    項(xiàng)目目錄
  3. 安裝依賴

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

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

    $ pm2 list //查看已運(yùn)行服務(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ù)器家淤,重啟即可

我是一只孤獨(dú)的狼......歡迎star

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末异剥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子絮重,更是在濱河造成了極大的恐慌冤寿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件青伤,死亡現(xiàn)場離奇詭異督怜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狠角,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門号杠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丰歌,你說我怎么就攤上這事姨蟋。” “怎么了立帖?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵眼溶,是天一觀的道長。 經(jīng)常有香客問我晓勇,道長堂飞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任绑咱,我火速辦了婚禮绰筛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羡玛。我一直安慰自己别智,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布稼稿。 她就那樣靜靜地躺著,像睡著了一般讳窟。 火紅的嫁衣襯著肌膚如雪让歼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天丽啡,我揣著相機(jī)與錄音谋右,去河邊找鬼。 笑死补箍,一個胖子當(dāng)著我的面吹牛改执,可吹牛的內(nèi)容都是我干的啸蜜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辈挂,長吁一口氣:“原來是場噩夢啊……” “哼衬横!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起终蒂,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜂林,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拇泣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噪叙,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年霉翔,在試婚紗的時候發(fā)現(xiàn)自己被綠了睁蕾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡债朵,死狀恐怖惫霸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葱弟,我是刑警寧澤壹店,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芝加,受9級特大地震影響硅卢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藏杖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一将塑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝌麸,春花似錦点寥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弟疆,卻和暖如春戚长,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怠苔。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工同廉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓迫肖,卻偏偏與公主長得像锅劝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蟆湖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容