You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

118 lines
4.4 KiB

// koa-router:提供全面的路由功能,比如类似Express的app.get/post/put的写法,URL命名参数、路由命名、嵌套路由、支持加载多个中间件
// koa-bodyparser:post提交数据中间件,解析请求体时需要加载的中间件,支持x-www-form-urlencoded, application/json等格式的请求体,不支持form-data的请求体
// koa-views:对进行视图模板渲染,支持ejs, nunjucks等模板引擎
// koa-static:静态资源中间件,用作类似Nginx的静态文件服务,在本地开发时可用于加载前端文件或后端Fake数据
// koa-session:session验证,支持将会话信息存储在本地Cookie或Redis, MongoDB
// koa-jwt:token验证,路由权限控制功能,Session Base转为用Token Base
// koa-helmet:网络安全,增加Strict-Transport-Security, X-Frame-Options, X-Frame-Options等HTTP头,提高应用程序的安全性
// koa-compress:当响应体较大时,启用类似Gzip的压缩技术减少传输内容
// koa-logger:输出请求日志的功能,包括请求的url、状态码、响应时间、响应体大小等信息
// koa-convert:基于Promise的中间件和基于Generate的中间件相互转换
// koa-nunjucks-2:轻量级 Nunjucks 中间件,可以用作模板引擎,为koa应用提供页面渲染功能
// koa-favicon:页面logo加载
// koa-json:get提交数据的中间件
// koa-onerror:在服务器产生错误(throw 抛出等)后自动重定义到指定路径
// koa-respond:在Koa上下文中添加了常用的方法
/**
* 添加依赖
* */
const Koa = require('koa')// 主依赖 Koa2
, logger = require('koa-logger')// 日志
// , bodyparser = require('koa-bodyparser')// 获取body的参数,post,支持x-www-form-urlencoded, application/json等格式的请求体,不支持form-data的请求体
, koaBody = require('koa-body')// 支持form-data,支持文件,不支持x-www-form-urlencoded,不可同时使用,
global.path = __dirname
/**
* 路由
* */
const router = require('./src/Routes/index')
/**
* 创建应用程序
* */
const app = new Koa();
// 数据库操作
// databaseOperation()
// 请求日志
app.use(logger());
// 时间
app.use(printMethod());
// ctx.request.body body参数
// 已过时,被koa-body替代
// app.use(bodyparser({
// enableTypes: ['json', 'form', 'text']
// }))
app.use(koaBody({
multipart:true, // 支持文件上传
encoding:'gzip',
strict:false,// 参数:如果启用,则不解析GET,HEAD,DELETE请求,默认为true
formidable:{
// uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录
keepExtensions: true, // 保持文件的后缀
maxFieldsSize:2 * 1024 * 1024, // 文件上传大小
// onFileBegin:(name,file) => { // 文件上传前的设置
// // console.log(`name: ${name}`);
// // console.log(file);
// },
}
}));
// token
app.use(verToken())
// 路由
app.use(router.routes(), router.allowedMethods({
// throw: true, // 抛出错误,代替设置响应头状态
// notImplemented: () => '不支持当前请求所需要的功能',
// methodNotAllowed: () => '不支持的请求方式'
}));
// veriToken
function verToken(){
return async function(ctx, next){
// 请求地址判断
if(ctx.req.url.indexOf('/api/user/will') == 0 || true){
await next()
}else{
const token = ctx.request.header.authorization
const result2 = global.token.decrypt(token)
// 判断此Token有没有过期
if(result2.token){
const result = await global.Redis.getToken(token)
// 判断Redis是否有此token
if(result){
ctx.uuid = result2.id.uuid
ctx.token = token
await next()
}else{
ctx.body = global.msg.failed({}, '账户令牌失效!', true)
}
}else{
ctx.body = global.msg.failed({}, '账户令牌失效。', true)
}
}
}
}
// 打印时间
function printMethod() {
return async function (ctx, next) {
const start = new Date()
await next()
const ms = new Date() - start
console.info(`Method ${ctx.method} ${ctx.url} - ${ms}ms`)
}
}
setTimeout(other)
function other(){
console.w('other test')
console.w(global.path)
}
module.exports = app;