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
koa2框架 的完整使用 项目代码
最新推荐文章于 2024-04-28 17:23:49 发布