簡介
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
};
- 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)部署步驟
-
build 生成app.js
npm run build
-
上傳服務(wù)器文件
項(xiàng)目目錄 -
安裝依賴
npm install
-
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ù)器家淤,重啟即可