#基于webpack构建的 Koa2 restful API 服务器脚手架
这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeScript编写。
GIT地址:https://github.com/Allenzihan/koa2-mysql-framework.git
此脚手架只安装了一些配合koa2使用的必要插件,不仅提供RESTful API实现,同时也集成了对静态资源的处理,支持跨越,代理转发请求等基础功能。基本上您仅需要关注您的业务开发即可。
脚手架可以根据不同的环境配置不同的信息运行价值,支持开发,测试,生产环境的不同参数配置。
#数据库选型MySQL
当然你也可以根据需要配置其他的关系型数据库,可扩展 sequelize.js 作为 PostgreSQL, MySQL, MariaDB, SQLite, MSSQL 关系型数据库的 ORM,本框架使用MVC分成模式实现,事例上通过SQL去实现对数据库的增、删、查、改操作。
## 目录结构说明
```bash
├── README.md
├── .babelrc # Babel 配置文件
├── .gitignore # Git 忽略文件列表
├── package.json # 描述文件
├── process.config.js # pm2 部署示例文件
├── bin # bin入口目录
│ └── www # 启动文件入口
├── .vscode # VS CODE 调式目录
│ └── launch.json # 调试配置
├── config # 配置文件
│ ├── db.config.js # 数据库配置文件
│ ├── logger.config.js # 日志配置文件
│ ├── proxy.config.js # 代理配置文件
│ └── session.config.js # session配置文件
├── src # 源代码目录,编译后目标源代码位于 dist 目录
│ ├── app.js # 入口文件
│ ├── files # 存放文件目录
│ ├── middleware # 中间件目录
│ └── errorRouteCatch.js # 示例插件 - router异常处理
│ ├── utils # 工具类目录
│ ├── controllers # 控制器
│ └── usersController.js # 示例users控制器
│ ├── models # 模型层
│ ├── routes # 路由层
│ └── users.js # 示例users路由
│ └── services # 服务层
│ └── usersService.js # 示例users服务层
├── public # 静态资源目录
└── logs # 日志目录
```
## 开发使用说明
```bash
git clone https://github.com/Allenzihan/koa2-mysql-framework.git
cd mv koa2-mysql-framework
npm install
npm run dev
访问: http://127.0.0.1:3000/home
```
## 开发调试说明
支持VSCODE调试 Node.js功能,已经配置好, 启动VSCODE IDE 上的Debug按钮即可调试
## 开发环境
npm run dev
## PM2 部署说明
提供了 PM2 部署 RESTful API Server 的示例配置,位于“process.config.js”文件中。
process.config.js 文件提供了两套环境的配置,分别是测试环境和生产环境的配置
启动测试环境:
npm run uat
如果启动失败,使用pm2 直接启动
pm2 start process.config.js --only uat
启动生产环境:
npm run prod
如果启动失败,使用pm2 直接启动
pm2 start process.config.js --only prod
以上使用pm2启动,需提前安装好pm2模块
PM2 配合 Docker 部署说明: http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/
### 关于 Token 使用的特别说明(JWT 身份认证)
app.use(jwt({
secret: publicKey.toString()
}).unless({
path: [
/^\/users\/login/,
/^\/home/,
/^\/assets/
]
}))
在 path 里面的开头路径则不进行身份认证,否则都将进行 鉴权。
前端处理方案:
```javascript
import axios from 'axios'
import { getToken } from './tool'
const DevBaseUrl = 'http://127.0.0.1:8080'
const ProdBashUrl = 'https://xxx.xxx'
let config = {
baseURL: process.env.NODE_ENV !== 'production' ? DevBaseUrl : ProdBashUrl // 配置API接口地址
}
let token = getToken()
if (token) {
config.headers = { Authorization: 'Bearer ' + token }
}
let request = axios.create(config)
// http request 拦截器
axios.interceptors.request.use(
config => {
if (window) {
let token = getToken()
if (token) {
// 判断是否存在token,如果存在的话,则每个http header都加上token
config.headers.Authorization = `Bearer ${token}`
}
}
// if (config.method === 'get') {
// config.url = config.url + 'timestamp=' + Date.now().toString()
// }
return config
},
err => {
return Promise.reject(err)
}
)
export default request
```
`tool.js`文件
```javascript
// 写 cookies
export let setCookie = function setCookie(name, value, time) {
if (time) {
let strsec = getsec(time)
let exp = new Date()
exp.setTime(exp.getTime() + parseInt(strsec))
document.cookie =
name + '=' + escape(value) + ';expires=' + exp.toGMTString()
} else {
document.cookie = name + '=' + escape(value)
}
}
// 读 cookies
export let getCookie = function(name) {
let reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
let arr = document.cookie.match(reg)
return arr ? unescape(arr[2]) : null
}
// 删 cookies
export let delCookie = function(name) {
var exp = new Date()
exp.setTime(exp.getTime() - 1)
var cval = getCookie(name)
if (cval != null) {
document.cookie = name + '=' + cval + ';expires=' + exp.toGMTString()
}
}
// 获取Token
export let getToken = function() {
if (window.sessionStorage && window.sessionStorage.Bearer) {
return window.sessionStorage.Bearer
} else if (window.localStorage && window.localStorage.Bearer) {
return window.localStorage.Bearer
} else if (window.document.cookie) {
return getCookie('Bearer')
}
}
// 设置Token
export let setToken = function(token, rememberTime) {
if (window.sessionStorage) {
window.sessionStorage.Bearer = token
}
if ((rememberTime && window.localStorage) || !window.sessionStorage) {
window.localStorage.Bearer = token
}
if (
window.document.cookie &&
!window.sessionStorage &&
!window.localStorage
) {
if (rememberTime) {
setCookie('Bearer', token, rememberTime)
} else {
setCookie('Bearer', token)
}
}
}
// 删除Token
export let delToken = function() {
if (window.sessionStorage && window.sessionStorage.Bearer) {
window.sessionStorage.removeItem('Bearer')
}
if (window.localStorage && window.localStorage.Bearer) {
window.localStorage.removeItem('Bearer')
}
if (window.document.cookie) {
delCookie('Bearer')
}
}
```
大概原理:
通过某个 API(通常是登录 API)获取成功后的 Token,存于本地,然后每次请求的时候在 Header 带上`Authorization: "Bearer " + token`,通常情况下无需担心本地 Token 被破解。
GIT地址:
https://github.com/Allenzihan/koa2-mysql-framework.git
- 前端调用后端的方法(基于restful接口的mvc架构)
1.前端调用后台: 建议用你熟悉的一门服务端程序,例如ASP,PHP,JSP,C#这些都可以,然后把需要的数据从数据库中获得,回传给客户端浏览器(其实一般就是写到HTML中,或者生成XML文件)然后在 ...
- RESTful API后台系统架构设计(Java)
最近设计和实现了一个JAVA的RESTful API的后台业务系统架构,主要基于Java平台.设计要求是: 性能:平均响应时间(RESTful API)小于2s(平均负载的情况下),并发访问200个以 ...
- ThinkPHP 5.0.7 + MySQL 构建RESTful API的小程序---02-ThinkPHP5中的orm的模型关联
ThinkPHP5.0中的操作ORM的一对一,一对多,多对多的操作: 由以下表举例: banner表的设计 id name description delete_time update_time 1 ...
- 开源的 Restful Api 集成测试工具 Hitchhiker
Hitchhiker 是一款开源的 Restful Api 集成测试工具,你可以在轻松部署到本地,和你的team成员一起管理Api. 先上图看看: 简单介绍 背景是Team在开发一些Api,这些Api ...
- Go实战--通过gin-gonic框架搭建restful api服务(github.com/gin-gonic/gin)
生命不止,继续 go go go !!! 先插播一条广告,给你坚持学习golang的理由: <2017 软件开发薪酬调查:Go 和 Scala 是最赚钱的语言> 言归正传! 之前写过使用g ...
- 使用 node-odata 轻松创建基于 OData 协议的 RESTful API
前言 OData, 相信身为.NET程序员应该不为陌生, 对于他的实现, 之前也有童鞋进行过介绍(见:这里1,这里2). 微软的WCF Data Service即采用的该协议来进行通信, ASP.NE ...
- Hitchhiker 是一款开源的 Restful Api 测试工具
Hitchhiker 是一款开源的 Restful Api 测试工具 开源API测试工具 Hitchhiker v0.4更新 - 没有做不到,只有想不到 Hitchhiker 是一款开源的 Restf ...
- 虚拟研讨会:如何设计好的RESTful API(转)
原文:虚拟研讨会:如何设计好的RESTful API? REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风 ...
- App后台开发运维和架构实践学习总结(2)——RESTful API设计技巧
前言 移动互联网时代,RESTful API成为越来越重要的移动端和服务器端交互的形式.尤其是在很多互联网公司或者传统行业拥抱移动互联网的时候,一套设计良好的Restful API能够帮助互联网产品支 ...
随机推荐
- [转]为什么group by后面不能使用别名(除MySQL)
同事工作中遇到一个问题: select count(billingdate),to_char(billingdate,'YYYYmm') month from tu_trade where to_ ...
- windows下的go get 显示进度
我的Go版本是:go1.12.7 1.在你的Go安装目录下找到 D:\Go\src\github.com\tools\godep\vendor\golang.org\x\tools\go\vcs\vs ...
- PHP制作的掷色子点数抽奖游戏实例
PHP制作的掷色子点数抽奖游戏实例,通过掷色子点数来达到抽奖的效果,为抽奖活动增添一些趣味性. 我们将在html页面中写下如下的html结构代码,.wrap用来放置色子和提示信息,#prize则是用来 ...
- Dynamics CRM邮件附件,你真的了解吗?
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复160或者20151014可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 听人问起怎么读取到一封邮件所有的 ...
- [logstash.outputs.elasticsearch] retrying failed action with response code: 403
0x00 Event [2019-09-24T19:22:31,655][INFO ][logstash.outputs.elasticsearch] retrying failed action w ...
- mysql忧化参数
转自 https://blog.51cto.com/tongcheng/1710265以下参数是在mysql-5.6.27中使用,可能mysql版本不同使用方法不一样1.线程参数innodb_read ...
- hadoop节点动态删除与增加
动态删除 1)修改配置文件 修改hdfs-site.xml文件,适当减小dfs.replication的数量,增加dfs.hosts.exclude选项 vi hdfs-site.xml <pr ...
- AtCoder Regular Contest 103
传送门 C - /\/\/\/ 题意: 给出一个序列\(\{a_i\}\),先要求其满足以下条件: \(a_i=a_{i+2}\) 共有两个不同的数 你现在可以修改任意个数,现问最少修改个数为多少. ...
- (day57)九、多对多创建的三种方式、Forms组件
目录 一.多对多三种创建方式 (一)全自动 (二)纯手撸(基本不用) (三)半自动(推荐使用) 二.forms组件 (一)校验数据 (1)常用内置字段及参数 (2)内置的校验器 (3)HOOK方法 ( ...
- 将静态页面部署到github.io
背景: 我的腾讯云服务器是之前利用学生身份(有优惠)买的,现在快到期了,而且服务器上面只有一个引导页(静态页面)还有用,别的项目都没有用了.所以就想找一种不花钱买服务器就可以访问到我的引导页的方法 ...