private :该文件下的路由是需要通过jwt验证的,才能进行访问。前面我们做了jwt的中间件,我们直接引入即可 router.use(jwtMiddleware) 记得要放在请求路由的前面,才能保证每次都经过它。
'use strict' const Router = require('koa-router') const controllers = require('../controllers') const jwtMiddleware = require('../middlewares/jwt') const router = new Router() router.prefix('/api') router.use(jwtMiddleware) router.get('/test', controllers.test.test) module.exports = router
public :该文件与上面相反,主要用来不进行登录的校验,也就是我们常用的登录、注册等不需要验证的接口。
'use strict' const Router = require('koa-router') const controllers = require('../controllers') const router = new Router() router.prefix('/api') router.post('/login', controllers.login.login) module.exports = router
为什么我们没在这里处理业务逻辑呢?其实这里是遵循了MVC的思想,进行了分离。把数据库的操作放到了controllers文件中。这如果我们接口一多,不会显示得特别混乱。下面我们就来讲这个文件。
controllers文件
为了让整个项目更为模块化,该目录下主要是处理对应的路由的回调函数,一般我们不会在router文件中去操作数据库和逻辑操作等步骤,这里采用 routes 和 controller 分开,在方便代码的查看同时,也方便代码的维护和开发。
index.js文件:
该文件与models中的index.js文件中的集合该目录下的文件类似,这里是将其他文件导出统一到index暴露出去。
'use strict' const fs = require('fs') const files = fs.readdirSync(__dirname).filter(file => file !== 'index.js') const controllers = {} for (const file of files) { if (file.toLowerCase().endsWith('js')) { const controller = require(`./${file}`) controllers[`${file.replace(/\.js/, '')}`] = controller } } module.exports = controllers
其他文件的编写可以按照下面基本框架进行,在这里会用到前面封装好的业务,例如数据库操作、响应、jwt等操作。大家可以认真看以下代码分析一下。
'use strict' const jwt = require('jsonwebtoken') const config = require('../config') const User = require('../models/index').getModel('user') const login = {} login.login = async (ctx, next) => { const {userName, password} = ctx.request.body const user = await User.findOne({userName: userName}) if (!user) { ctx.result = '' ctx.msg = '用户不存在' } else { ctx.result = jwt.sign({ data: user._id, // 设置 token 过期时间 exp: Math.floor(Date.now() / 1000) + (60 * 60), // 60 seconds * 60 minutes = 1 hour }, config.secret) } return next() } module.exports = login
config.js文件
该文件主要用来存放全局的配置,如果一个项目中没有全局的配置,那么一个地方改动牵动的其他地方很多,这样很不利于工作效率,在开发过程中,我们一般会把常用的都放在这个文件,例如:数据库参数,端口,密钥,全局变量等。看自己的需求适当的更改。该文件将变量进行了暴露,引用时进行require即可。
'use strict' const path = require('path') module.exports = { port: '3001', secret: 'secret', publicDir: path.resolve(__dirname, './public'), logPath: path.resolve(__dirname, './logs/koa-template.log'), mongoDB: { database: 'mall', username: 'root', password: 'root', host: '127.0.0.1', port: 27017 } }
package.json文件
每个Nodejs项目的根目录下面,一般都会有一个package.json文件。该文件可以由npm init生成,定义了项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。 package.json文件内部就是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。我们也可在里面配置我们的 npm run XXX 的命令,大家可以根据需求进行配置。这是这项目需要用到的package.json文件。
{ "name": "koa-template", "version": "0.1.0", "author": "bayi", "private": true, "scripts": { "start": "node ./bin/www", "dev": "pm2 start ecosystem.config.js --env dev", "test": "pm2 start ecosystem.config.js --env test", "pro": "pm2 start ecosystem.config.js --env pro", "logs": "pm2 logs", "stop": "pm2 stop ecosystem.config.js" }, "dependencies": { "koa": "^2.6.2", "koa-bodyparser": "^4.2.1", "koa-helmet": "^4.1.0", "koa-jwt": "^3.5.1", "koa-router": "^7.4.0", "koa-static-cache": "^5.1.2", "koa2-cors": "^2.0.6", "log4js": "^3.0.6", "mongoose": "^5.5.5" } }
三、其他
####github地址:
https://github.com/bayi-lzp/koa-template (star! star!star!)