mongoose换成mysql_Package - tms-koa
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
mongoose换成mysql_Package - tms-koa相关推荐
- mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中
FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...
- 女朋友存好多网上男明星的照片,我准备用python全部换成我的脸
最近发现女朋友的手机和电脑里面存了好多男明星的照片,有我认识的,还有好多我不认识的! (醋坛子翻了!) 我要把那些男明星的脸换成我的脸!本来打算用ps来操作,发现工作量有点大,所以就利用python来 ...
- 将一张100元的钞票换成1元、5元和10元的钞票,每种钞票至少一张,编写程序输出所有的换法,循环次数需要尽可能地少。
2.将一张100元的钞票换成1元.5元和10元的钞票,每种钞票至少一张,编写程序输出所有的换法,循环次数需要尽可能地少. public class Two_2money { public static ...
- SAP HUM 如何将HU里的物料号换成另外一个物料号?
SAP HUM 如何将HU里的物料号换成另外一个物料号? 比如HU 183221204047,里面的物料号是10000191, 业务因故包错了物料号,希望在继续使用HU号码的前提下将物料号由10000 ...
- 学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?...
学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?请看到这还不理解我想说什么的朋友自行编写代码实现一下,就会有特别深刻的印象了. 解决方案:编写程序模拟笔算 ...
- resin如何部署java项目_resin项目换成tomcat部署的两种方式
1.直接把Resin为服务器的工程根目录复制到tomcat的webapps下面,具体访问路径是:http://localhost:8080/webapp. 2.在tomcat的安装目录/conf/Ca ...
- AMDF换成ACF和AMDF合作算法
首先,整体框架的基本构架如下所示: 编码: 解码: ·AMDF换成ACF和AMDF合作算法 这里,根据论文的说明,我们可以看到,传统的AMDF算法或者ACF算法都无法满足实际的需求,这里,通过计算AM ...
- 千兆路由器怎么设置网速最快_200M的网速,换成千兆路由器,我得到了什么?...
在家远程工作的这段时间,我常常感觉网速有点不给力.开音频远程会议的时候,很多同事抱怨我的声音断断续续.如果我电话打入会议就没有问题.我觉得有必要对家里的网络研究研究. 家里办的是联通的200M网络,配 ...
- android怎样将bar的label居中_从iPhone换成Android手机之后,将是一种怎样的不同体验...
欢迎转载,请注明出处,抄袭必究! 随着国产手机的不断发展,性能提升,价格优势突出,不少的网友准备放弃苹果手机,选择加入到安卓阵营,那么从iPhone换成Android手机之后,将是一种怎样的不同体验! ...
最新文章
- struts2中OGNL的访问
- ps怎么清屏_PS:oracle恢复删除的数据
- 【NOIP2017模拟6.25】小W的动漫
- 如何升软件开发项目的利润
- 获取进程或线程的ID以及句柄信息
- 深度学习笔记(34) 目标检测
- 2019二级c语言模拟考试软件,全国计算机等级考试超级模拟软件(二级c)v2019.3
- Android动画效果
- python基础教程代码-Python基础教程代码怎么是英文 看不懂啊?
- jsf集成spring_JSF Spring Hibernate集成示例教程
- java地址有什么构成_IP地址采用分层结构,由( )组成。
- 34_注解的定义与反射调用
- 【ensp】单臂路由与生成树的配置
- 【工具篇】maven指令大全
- 微信小程序开发手记1.0
- HDU1238 Substrings
- 学习汇编语言的重要性
- antdvue的table合计行
- java如何编写一个qq宠物程序_肿么用java编写一个QQ宠物喂食的程序?
- UVa 10074 - Take the Land
热门文章
- 移动端H5 腾讯地图sdk 当前位置 地址你解析 距离计算
- max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
- SpringBoot 集成 MyBatisPlus 模板
- REDIS 关键配置简述
- Flowable 数据库表结构 ACT_RU_JOB
- 第11篇:Flowable-BPMN部署常见问题没有对ACT_RE_PROCDEF表进行插入操作
- SonarQube上传分析报告失败
- Excel 表单控件之 CheckBox 集合事件响应
- 蓝牙打印和网口打印的实现
- 【算法】合并两个有序数组【LeetCode】