An API server template developed using egg 一个使用阿里egg开发RESTful API服务器模板
$ npm i $ npm run dev $ open http://localhost:7001/
更过用法和命令可查阅egg文档
该项目是使用egg + mongodb + jsonwebtoken实现的一个简单的RESTful API服务器模板
该目录说明来源中egg文档,具体可查目录结构
egg-project
├── package.json
├── app
| ├── router.js // 路由主文件
| ├── routers // 路由文件夹(主要是用于区分模块,方便日后的维护和查阅)
│ | └── user.js // 用户模块路由
│ ├── controller
│ | └── user.js
│ ├── model (可选) // 使用egg-mongoose管理mongodb的model文件 * 该文件夹下最好不要在添加文件夹,会出现model找不到的问题
│ | └── user.js
│ ├── service (可选) // 主要业务逻辑
│ | └── user.js
│ ├── middleware (可选) // 中间件
│ | └── jwt.js
│ └── extend (可选)
│ ├── helper.js (可选)
├── config
| ├── plugin.js
| ├── config.default.js
│ ├── config.prod.js
| ├── config.test.js (可选)
| ├── config.local.js (可选)
| └── config.unittest.js (可选)
如上,由框架约定的目录:
- app/router.js 用于配置 URL 路由规则,具体参见 Router。
- app/controller/** 用于解析用户的输入,处理后返回相应的结果,具体参见 Controller。
- app/service/** 用于编写业务逻辑层,可选,建议使用,具体参见 Service。
- app/middleware/** 用于编写中间件,可选,具体参见 Middleware。
- app/public/** 用于放置静态资源,可选,具体参见内置插件 egg-static。
- app/extend/** 用于框架的扩展,可选,具体参见框架扩展。
- config/config.{env}.js 用于编写配置文件,具体参见配置。
- config/plugin.js 用于配置需要加载的插件,具体参见插件。
- app.js 和 agent.js 用于自定义启动时的初始化工作,可选,具体参见启动自定义。关于agent.js的作用参见Agent机制。 由内置插件约定的目录:
- app/public/** 用于放置静态资源,可选,具体参见内置插件 egg-static。
- app/schedule/** 用于定时任务,可选,具体参见定时任务。
实现思路来自
egg基于jsonwebtoken的Token实现认证机制
作者坏壊ヤ孩孓气
- 在middleware文件下新建一个jwt.js文件
'use strict'; module.exports = () => { return async function(ctx, next) { let authToken = ctx.header.authorization; if (authToken) { authToken = authToken.substring(7); const res = await ctx.helper.verifyToken(ctx, authToken); if(res.exp > Math.floor(Date.now() / 1000)) { // 在其它页面可以使用 this.ctx.locals.user 来获取该值 ctx.locals.user = res.data; await next(); } else { ctx.helper.successOtherWithoutData({ctx, code: 401, msg: '登录状态已过期,请重新登陆'}); } } else { ctx.helper.successOtherWithoutData({ctx, code: 401, msg: '请登陆后再进行操作'}); } } }
- 在extend/helper.js中实现jwt token的生成和验证
// 生成token exports.createToken = (ctx, _id) => { return jwt.sign({ data: { _id: _id }, exp: Math.floor(Date.now() / 1000) + (60 * 60 * 6) }, ctx.app.config.jwt.secret) } // 验证token exports.verifyToken = (ctx, token) => { let result = {}; try { result = jwt.verify( token, ctx.app.config.jwt.secret ); } catch (err) { // err } finally { return result; } }
在config.js文件中设置需要验证的路径
jwt: { secret: 'JWTTOKEN', // jwt加密密钥,自定义 enable: true, match: '/api' // 路径匹配,以/api开头的请求需要验证 },
在需要验证的请求的header中添加验证
Authorization: Bearer + token