tms-koa
基于koa的輕量級快速開發框架,包含 MVC 中的 M 和 C 兩部分,適合于實現 API 服務和前后端徹底分離的應用。
內置基于 access_token 的訪問鑒權機制,更容易實現 API 調用的負載分擔。
內置通過連接池訪問 MySQL 數據庫,支持進行讀寫分離。內置 SQL 語句的封裝,內置 escape 防止 sql 注入。目前 where 條件中,exists,and,or 形成的 sql 不會進行 escape 處理,需要在外部自行處理。select 中的 fields 和 table 未進行 escape 處理,不能夠直接使用用戶輸入的內容作為字段名和表名。orderby 和 groupby 未做 escape 處理,不能夠直接使用用戶輸入。
內置支持上傳文件。
安裝
npm install tms-koa --save
注意:tms_db,mongodb,mongoose,redis 這 4 個依賴包采用peerDependencies,不會進行自動安裝,如果需要使用可以手動安裝。tms-db 的依賴包 mysql 和 better-sqlite3 采用peerDependencies,不會進行自動安裝,如果需要使用可以手動安裝。
測試
安裝pm2(如果沒裝過)
cnpm i pm2 -g
通過pm2啟動
npm run pm2
啟動 Redis 和 MongoDb
docker-compose up -d
發送獲得 token 的請求
http://localhost:3001/auth/authorize
發送調用 api 的請求
http://localhost:3001/api/tryGet?access_token=&value=hello
建立新應用
配置信息
在項目的根目錄下建立文件/config/app.js,指定下列信息:
module.exports = {
port: 3000,
name: 'tms-koa-0',
router: {
auth: {
prefix: '', // 接口調用url的前綴
},
controllers: {
prefix: '', // 接口調用url的前綴,例如:/api
},
},
auth: {
captcha: { code: 'a1z9' },
client: { accounts: [{ id: 1, username: 'user1', password: '123456' }] },
jwt: {
privateKey: 'tms-koa-secret',
expiresIn: 7200,
},
},
tmsTransaction: false,
}
路由(router)
controllers的prefix 在 url 中出現,例如:http://localhost:3001/api/tryGet?value=hello,但是不在 controller 的路徑中出現,例如:controllers/main.js 為與 url 對應的控制器。
認證(auth)
auth部分是可選的,如果不配置或者disabled設置為true,就不啟動鑒權機制。
支持jwt和redis兩種token認證機制,都支持用disabled關閉,若同時設置,jwt優先于redis。
redis
在項目的根目錄下建立文件/config/redis.js,指定下列 Redis 連接信息:
module.exports = {
disabled: false, // 可選項,不需要指定。主要用于開發調試階段。
master: {
host: '127.0.0.1',
port: 6379,
},
}
關系數據庫(mysql 或 sqlite)
在項目的根目錄下建立文件/config/db.js,指定下列 MySQL 或 Sqlite 數據庫(可選)連接信息:
module.exports = {
mysql: {
master: {
connectionLimit: 10,
host: '',
port: '',
user: '',
password: '',
database: '',
},
write: {
connectionLimit: 10,
host: '',
port: '',
user: '',
password: '',
database: '',
},
},
sqlite: {
path: '',
},
}
mongodb
在項目的根目錄下建立文件/config/mongodb.js,指定下列 MongoDb 連接信息:
module.exports = {
disabled: false, // 可選項,不需要指定。主要用于開發調試階段。
master: {
host, // 如果要連接復制集,這里是復制集節點的主機地址數組
port: 27017, // 如果要連接復制集,這里是復制集節點的主機端口數組
replicaSet, // 復制集的名稱
},
}
注意:如果項目要使用 mongodb,需要在項目中安裝 mongodb 包。
mongoose
在項目的根目錄下建立文件/config/mongoose.js,指定下列 mongoose 連接信息:
module.exports = {
disabled: false, // 可選項,不需要指定。主要用于開發調試階段。
host,
port: 27017,
database: 'test',
}
注意:如果項目要使用 mongoose,需要在項目中安裝 mongoose 包。
文件服務
文件管理,例如:保存上傳文件
module.exports = {
local: {
rootDir: 'files' // 指定保存文件的根目錄
database: {
dialect: 'mongodb',
database:'upload',
file_table: 'files'
},
schemas: {
$schema: 'http://json-schema.org/draft-07/schema#',
type: 'object',
title: 'Json-Doc-File',
description: 'tms-vue-finder file',
properties: {
comment: {
type: 'string',
minLength: 0,
maxLength: 80,
title: '說明1',
attrs: {
placeholder: '請輸入說明',
title: '說明1'
}
}
}
}
}
}
tms-koa 支持保存上傳文件的擴展信息。可以指定將信息保存在數據庫中,例如:mongodb。指定的數據庫需要在/config/mongodb.js 中存在。
啟動代碼
建立文件app.js(可根據需要自行命名)
const { TmsKoa } = require('tms-koa')
const tmsKoa = new TmsKoa()
tmsKoa.startup()
可以在 startup 中添加其他中間件(middleware),例如:
控制器之前
tmsKoa.startup({beforeController:[]})
控制器之后
tmsKoa.startup({afterController:[]})
完成初始化,啟動 http 和 https 端口之前
tmsKoa.startup({afterInit:function(context){}})
API 代碼
建立 controllers 目錄防止 API 代碼,參考內置模塊控制器部分。
內置模塊
認證機制
在項目的根目錄下建立文件/auth/client.js,實現一個根據 http 請求 返回Clinet對象的方法。
通過調用/auth/authorize獲得access_token,它的值和client.js返回的對象存在一一對應的關系。
獲得的access_token會存儲在 Redis 中,有效期是7200秒。格式為應用名稱(app.js 中的 name),內容名AccessToken,token字符串,用戶id字符串(來源于 client.js 中指定的 id),中間用:分隔。
tms-koa-0:AccessToken:c89d35281105456babd15d94831424c7:userid
利用這個機制可以用tms-koa實現一個基于 token 的 api 鑒權中心。
通過調用/auth/client用access_token獲得用戶信息。
詳細說明參加:訪問控制
控制器(API)
項目根目錄下創建controllers目錄,路徑和 url 匹配
需要從 Ctrl 類繼承。
const { Ctrl, ResultData } = require('tms-koa')
class Main extends Ctrl {
tmsRequireTransaction() {
return {
get: true,
}
}
get() {
return new ResultData('I am an api.')
}
}
module.exports = Main
路由與控制器匹配規則
tms-koa會根據url自動匹配/controllers目錄下的控制器文件。
路由格式:http://yourhost/{prefix}/{controller}/{method}
參數
說明
prefix
/config/app.js文件中,router/controlers/prefix中指定的內容。
controller
和/controllers目錄下的文件對應。main.js作為目錄中的默認控制,如果url匹配的是目錄,tms-koa會嘗試匹配main.js文件。
method
匹配到的Ctrl對象的方法。
參考:/lib/controller/router.js文件。
模型(model)
項目根目錄下創建models目錄。
模型必須從 DbModel 繼承。
必須在導出包中提供一個用戶創建實例的create方法。DbModel類中已經內置一個創建實例的方法的create方法,它的子類可參照下面的例子進行調用。
const { DbModel } = require('tms-koa')
class Template extends DbModel {
constructor({ db = null, debug = false } = {}) {
super('template', { db, debug })
}
}
module.exports = { Template, create: Template.create.bind(Template) }
已經在 model 層中進行 escape 處理,防止 sql 注入。關于 escape 請參考:tms_db。
靜態文件
項目根目錄下創建public目錄。
控制器守衛方法
在控制器類(Ctrl)中添加方法,說明需要在調用接口前執行的代碼。
async tmsBeforeEach(method) {
// 返回ResultFault及其子類的對象,終止接口調用
// return new ResultFault('發生錯誤')
return true
}
文件上傳和下載
domain bucket path
domain 和 bucket 對用戶是不可見的?但是要直接訪問呢?
需要在部署階段創建程序運行后用到的domain,例如在files目錄下創建tests目錄,用于保存單元測試產生的文件。
在 controllers 目錄創建文件 upload.js(可根據需要命名),用于上傳文件。
const { UploadCtrl } = require('tms-koa/lib/controller/fs')
class Upload extends UploadCtrl {
constructor(...args) {
super(...args)
}
}
module.exports = Upload
在 controllers 目錄創建文件 browse.js(可根據需要命名),用于瀏覽文件。
const { BrowseCtrl } = require('tms-koa/lib/controller/fs')
class Browse extends BrowseCtrl {
constructor(...args) {
super(...args)
}
}
module.exports = Browse
記錄日志
在啟動代碼中添加如下文件
const log4jsConfig = require('./config/log4js')
const log4js = require('log4js')
log4js.configure(log4jsConfig)
Current Tags
0.0.64 ???????????????????? ????????? ... ????????? latest (22 days ago)
60 Versions
0.0.64 ???????????????????? ????????? ... ????????? 22 days ago
0.0.63 ???????????????????? ????????? ... ????????? 23 days ago
0.0.62 ???????????????????? ????????? ... ????????? a month ago
0.0.61 ???????????????????? ????????? ... ????????? 2 months ago
0.0.60 ???????????????????? ????????? ... ????????? 2 months ago
0.0.59 ???????????????????? ????????? ... ????????? 2 months ago
0.0.58 ???????????????????? ????????? ... ????????? 2 months ago
0.0.57 ???????????????????? ????????? ... ????????? 2 months ago
0.0.56 ???????????????????? ????????? ... ????????? 2 months ago
0.0.55 ???????????????????? ????????? ... ????????? 2 months ago
0.0.54 ???????????????????? ????????? ... ????????? 2 months ago
0.0.53 ???????????????????? ????????? ... ????????? 3 months ago
0.0.52 ???????????????????? ????????? ... ????????? 3 months ago
0.0.50 ???????????????????? ????????? ... ????????? 4 months ago
0.0.49 ???????????????????? ????????? ... ????????? 7 months ago
0.0.48 ???????????????????? ????????? ... ????????? 7 months ago
0.0.47 ???????????????????? ????????? ... ????????? 7 months ago
0.0.46 ???????????????????? ????????? ... ????????? 8 months ago
0.0.45 ???????????????????? ????????? ... ????????? 8 months ago
0.0.44 ???????????????????? ????????? ... ????????? 8 months ago
0.0.43 ???????????????????? ????????? ... ????????? 8 months ago
0.0.42 ???????????????????? ????????? ... ????????? 8 months ago
0.0.41 ???????????????????? ????????? ... ????????? 8 months ago
0.0.40 ???????????????????? ????????? ... ????????? 9 months ago
0.0.39 ???????????????????? ????????? ... ????????? 9 months ago
0.0.38 ???????????????????? ????????? ... ????????? 9 months ago
0.0.37 ???????????????????? ????????? ... ????????? 9 months ago
0.0.36 ???????????????????? ????????? ... ????????? 9 months ago
0.0.35 ???????????????????? ????????? ... ????????? 9 months ago
0.0.34 ???????????????????? ????????? ... ????????? 10 months ago
0.0.33 ???????????????????? ????????? ... ????????? 10 months ago
0.0.32 ???????????????????? ????????? ... ????????? 10 months ago
0.0.31 ???????????????????? ????????? ... ????????? a year ago
0.0.30 ???????????????????? ????????? ... ????????? a year ago
0.0.29 ???????????????????? ????????? ... ????????? a year ago
0.0.28 ???????????????????? ????????? ... ????????? a year ago
0.0.27 ???????????????????? ????????? ... ????????? a year ago
0.0.26 ???????????????????? ????????? ... ????????? a year ago
0.0.25 ???????????????????? ????????? ... ????????? a year ago
0.0.22 ???????????????????? ????????? ... ????????? a year ago
0.0.21 ???????????????????? ????????? ... ????????? a year ago
0.0.20 ???????????????????? ????????? ... ????????? a year ago
0.0.19 ???????????????????? ????????? ... ????????? a year ago
0.0.18 ???????????????????? ????????? ... ????????? a year ago
0.0.17 ???????????????????? ????????? ... ????????? a year ago
0.0.16 ???????????????????? ????????? ... ????????? a year ago
0.0.15 ???????????????????? ????????? ... ????????? a year ago
0.0.13 ???????????????????? ????????? ... ????????? a year ago
0.0.12 ???????????????????? ????????? ... ????????? a year ago
0.0.11 ???????????????????? ????????? ... ????????? a year ago
0.0.10 ???????????????????? ????????? ... ????????? a year ago
0.0.9 ???????????????????? ????????? ... ????????? a year ago
0.0.8 ???????????????????? ????????? ... ????????? a year ago
0.0.7 ???????????????????? ????????? ... ????????? a year ago
0.0.6 ???????????????????? ????????? ... ????????? a year ago
0.0.5 ???????????????????? ????????? ... ????????? a year ago
0.0.4 ???????????????????? ????????? ... ????????? a year ago
0.0.3 ???????????????????? ????????? ... ????????? a year ago
0.0.2 ???????????????????? ????????? ... ????????? a year ago
0.0.1 ???????????????????? ????????? ... ????????? a year ago