最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。
程序员文章站
2023-12-31 15:09:58
#基于webpack构建的 Koa2 restful API 服务器脚手架 这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeScript编写。 GIT地址:https://github.com/Allenzihan/koa2-mysql ......
#基于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