在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:yi-ge/Koa2-API-Scaffold开源软件地址:https://github.com/yi-ge/Koa2-API-Scaffold开源编程语言:JavaScript 98.5%开源软件介绍:Koa2 RESTful API 服务器脚手架这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6。 注意: 因升级 Koa 版本至 2.3.0+,为配合相应的依赖项,故需要 Node.js 版本大于等于 v8.0.0(建议 v11.13.0),NPM 大于等于 v5.0.0。建议使用 yarn 代替 npm。 约定使用 JSON 格式传输数据,POST、PUT、DELET 方法支持的 Content-Type 为 可选用 redis 等非关系型数据库。考虑 RESTful API Server 的实际开发需要,这里通过 sequelize.js 作为 PostgreSQL, MySQL, MariaDB, SQLite, MSSQL 关系型数据库的 ORM,如无需关系型 ORM, 此脚手架只安装了一些和 Koa2 不冲突的搭建 RESTful API Server 的必要插件,附带每一个插件的说明。采用 ESlint 进行语法检查。 因此脚手架主要提供 RESTful API,故暂时不考虑前端静态资源处理,只提供静态资源访问的基本方法便于访问用户上传到服务器的图片等资源。基本目录结构与 vue-cli 保持一致,可配合 React、AngularJS、Vue.js 等前端框架使用。在 Cordova/PhoneGap、Electron 中使用时需要开启跨域功能。 免责声明: 此脚手架仅为方便开发提供基础环境,任何人或组织均可随意克隆使用,使用引入的框架需遵循原作者规定的相关协议(部分框架列表及来源地址在下方)。项目维护者均不对采用此脚手架产生的任何后果负责。 基于 Vue 2,Webpack 4,Koa 2 的 SSR 脚手架:https://github.com/yi-ge/Vue-SSR-Koa2-Scaffold。 开发使用说明git clone https://github.com/yi-ge/koa2-API-scaffold.git
cd mv koa2-API-scaffold
npm install
npm run dev # 可执行npm start跳过ESlint检查。 调试说明npm run dev --debug
Or
npm start --debug 支持 Node.js 原生调试功能:https://nodejs.org/api/debugger.html 开发环境部署生成 node 直接可以执行的代码到 dist 目录: npm run build npm run production # 生产模式运行
# Or
node dist/app.js PM2 部署说明提供了 PM2 部署 RESTful API Server 的示例配置,位于“pm2.js”文件中。 pm2 start pm2.js PM2 配合 Docker 部署说明: http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/ Docker 部署说明docker pull node
docker run -itd --name RESTfulAPI -v `pwd`:/usr/src/app -w /usr/src/app node node ./dist/app.js 通过'docker ps'查看是否运行成功及运行状态 Linux/Mac 直接后台运行生产环境代码有时候为了简单,我们也这样做: nohup node ./dist/app.js > logs/out.log & 查看运行状态(如果有'node app.js'出现则说明正在后台运行): ps aux|grep app.js 查看运行日志 cat logs/out.log 监控运行状态 tail -f logs/out.log 配合 Vue-cli 部署说明Vue-cli(Vue2)运行'npm run build'后会在'dist'目录中生成所有静态资源文件。推荐使用 Nginx 处理静态资源以达最佳利用效果,然后通过上述任意一种方法部署 RESTful API 服务器。前后端是完全分离的,请注意 Koa2 RESTful API Server 项目中 config/main.json 里面的跨域配置。 推荐的 Nginx 配置文件:
Docker 中 Nginx 运行命令(将上述配置文件任意命名放置于 nginx_config 目录中即可): docker run -itd -p 80:80 -p 443:443 -v `pwd`/nginx_config:/etc/nginx/conf.d nginx 关于 Token 使用的特别说明(JWT 身份认证)
在 path 里面的开头路径则不进行身份认证,否则都将进行 � 鉴权。 前端处理方案: 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;
// 写 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 带上 引入插件介绍
引入的插件: koa2: HTTP 框架 koa-body: body 解析器 koa-router: Koa 路由 koa-static2: 静态资源中间件 koa-compose: 多个中间件组合成一个 require-directory: 递归遍历指定目录 babel-cli: Babel 编译 ES6 代码为 ES5 代码 babel-register: Babel 开发环境实时编译 ES6 代码 babel-plugin-transform-runtime: Babel 配置 ES6 的依赖项 gulp: 基于流的自动化构建工具 gulp-eslint: gulp 的 ESLint 检查插件 gulp-nodemon: 修改 JS 代码后自动重启 eslint: JavaScript 语法检查工具 eslint-config-standard: 一个 ESlint 配置 Synopsis: ESLint Shareable Config for JavaScript Standard Style. eslint-friendly-formatter: 使得 ESlint 提示在 Sublime Text 或 iterm2 中更友好,Atom 也有对应的 ESlint 插件。 eslint-plugin-html: 检查 HTML 文件中的 JS 代码规范 eslint-plugin-promise: 检查 JavaScript promises eslint-plugin-promise: ESlint 依赖项 nodemailer: 发送邮件 promise-mysql: 操作 MySQL 数据库依赖 sequelize: 关系型数据库 ORM mysql: MySQL 库 支持 Koa2 的中间件列表:https://github.com/koajs/koa/wiki 其它经常配合 Koa2 的插件: koa-session2: Session 中间件 koa-nunjucks-2: koa-favicon: koa-server-push: koa-convert: 转换旧的中间件支持 Koa2 koa-logger: 请求日志输出,需要配合上面的插件使用 koa-onerror: koa-multer: 处理数据中间件 目录结构说明.
├── README.md
├── .babelrc # Babel 配置文件
├── .editorconfig # 编辑器风格定义文件
├── .eslintignore # ESlint 忽略文件列表
├── .eslintrc.js # ESlint 配置文件
├── .gitignore # Git 忽略文件列表
├── gulpfile.js # Gulp配置文件
├── package.json # 描述文件
├── pm2.js # pm2 部署示例文件
├── build # build 入口目录
│ └── dev-server.js # 开发环境 Babel 实时编译入口
├── src # 源代码目录,编译后目标源代码位于 dist 目录
│ ├── app.js # 入口文件
│ ├── config.js # 主配置文件(*谨防泄密!)
│ ├── plugin # 插件目录
│ └── smtp_sendemail # 示例插件 - 发邮件
│ ├── tool # 工具目录
│ ├── PluginLoader.js # 插件引入工具
│ └── Common.js # 示例插件 - 发邮件
│ ├── lib # 库目录
│ ├── controllers # 控制器
│ ├── models # 模型
│ ├── routes # 路由
│ └── services # 服务
├── assets # 静态资源目录
└── logs # 日志目录 集成 NUXT 请求时身份认证说明
各类主流框架调用 RESTful API 的示例代码(仅供参考)AngularJS (Ionic 同)$http({
method: "post",
url: "http://localhost:3000/xxx",
data: { para1: "para1", para2: "para2" },
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
})
.success(function (data) {
// do something
})
.error(function (data) {
// do something
}); jQuery$.ajax({
cache: false,
type: "POST",
url: "http://localhost:3000/xxx",
data: {
para1: para1,
},
async: false,
dataType: "json",
success: function (result) {},
error: function (err) {
console.log(err);
},
});
// 上传文件
//创建FormData对象
var data = new FormData();
//为FormData对象添加数据
//
$.each($("#inputfile")[0].files, function (i, file) {
data.append("upload_file", file);
});
$.ajax({
url: "http://127.0.0.1:3000/api/upload_oss_img_demo",
type: "POST",
data: data,
cache: false,
contentType: false, //不可缺
processData: false, //不可缺
success: function (data) {
console.log(data);
if (data.result == "ok") {
$("#zzzz").attr("src", data.img_url);
}
},
}); |