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
118 lines
4.4 KiB
2 years ago
|
// 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;
|