koa2框架 的完整使用 项目代码

app.js
const config = require('config');
const Koa = require('koa');
const app = new Koa();
const views = require('koa-views');
const json = require('koa-json');
const errorHandler = require('koa-onerror');
const bodyParser = require('koa-bodyparser');
const logger = require('koa-logger');
const session = require('koa-session');
const store = require('./middleware/store-middleware');
const auth = require('./middleware/auth-middleware')
const sessionStore = require('./libs/session-redis-store')
const redis = require('async-redis').createClient(config.get('redis'));
const c2k = require('koa2-connect');
const proxy = require('http-proxy-middleware');
const index = require('./routers/index');
const user = require('./routers/user');
const mobile = require('./routers/mobile');
const phone = require('./routers/phone');
const fs = require('fs');
const proxyRouter = require('koa-router')();


app.keys = config.get('session_keys');
app.context.config = config;
app.context.redis = redis;

// error handler
errorHandler(app);

proxyRouter.all('/v1/*', async function(ctx) {
  let ip = ctx.request.ip;
  if (ctx.request.get('X-Real-IP')) {
    ip = ctx.request.get('X-Real-IP')
  }
  if (ip.substr(0, 7) === "::ffff:") {
    ip = ip.substr(7)
  }
  return c2k(proxy({
    target: config.get('api_base_url'),
    changeOrigin: true,
    headers: {
      'X-Real-IP': ip
    },
    pathRewrite: {
      '^/v1/': ''
    }
  }))(ctx)
});
app.use(proxyRouter.routes()).use(proxyRouter.allowedMethods());

app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    if (err instanceof Error && err.code === 10010009) {
      ctx.cookies.set(config.get('session_name'))
      ctx.response.redirect(ctx.request.path)
      ctx.body = '302'
      ctx.res.end(ctx.body)
    }else if(err instanceof Error && err.code === 500) {
     let picFiles= fs.readFileSync('./views/index/unableConnect.swig', 'utf8')
      ctx.response.type = 'text/html';
      ctx.response.body =picFiles
    }else if (err instanceof Error && err.code!== 500){
      ctx.set('content-type', 'application/json; charset=utf-8')
      ctx.status = 200
      ctx.res.end(JSON.stringify({msg: err.message, code: err.code}))
    }
  }
})

app.use(async (ctx, next) => {
    await next();
    if (parseInt(ctx.status) === 404) {
        ctx.response.redirect("/404")
    }
})


// middlewares
if (process.env.NODE_ENV !== 'production') {
    app.use(logger());
}

app.use(require('koa-static')(__dirname + '/public'));
app.use(session({
    key: config.get('session_name'),
    maxAge: config.get('session_expire'),
    store: sessionStore(redis)
}, app));
app.use(bodyParser({
    enableTypes: ['json', 'form', 'text']
}));
app.use(json());
app.use(views(__dirname + '/views', {
    extension: 'swig',
    options: {
        CDN_SERVER: config.get('cdn_server'),
        VERSION: config.get('version')
    }
}));
app.use(store);
app.use(auth);

// routers
app.use(index.routes()).use(index.allowedMethods());
app.use(user.routes()).use(user.allowedMethods());
app.use(mobile.routes()).use(mobile.allowedMethods());
app.use(phone.routes()).use(phone.allowedMethods());


// error-handling
app.on('error', (err, ctx) => {
    conso
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值