index.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. let Koa = require("koa");
  2. let app = new Koa();
  3. const KoaStatic = require("koa-static");
  4. let fileUtil = require("./server/util/fileUtil");
  5. let installApp = require("./server/middleware/install");
  6. let log = require("./server/util/log");
  7. let bodyParser = require("koa-bodyparser");
  8. let koaBody = require("koa-body");
  9. let config = require("./server/config/config");
  10. let responseFormat = require("./server/util/responseFormat");
  11. let path = require("path");
  12. let startFilePath = path.resolve(__dirname, "./bin/start.sh");
  13. /**
  14. * register router and connect db to expose serve
  15. *
  16. * @return {void}
  17. */
  18. async function startServe() {
  19. if (await fileUtil.exists(startFilePath)) {
  20. let AppRouter = require("./server/router/index");
  21. let connectDB = require("./server/database/connect");
  22. let redis = require("./server/database/redisStorage.js");
  23. let session = require("koa-session2");
  24. // redis记录session
  25. app.use(
  26. session({
  27. store: redis,
  28. })
  29. );
  30. await connectDB();
  31. // register router
  32. new AppRouter(app);
  33. } else {
  34. app.use(installApp());
  35. }
  36. }
  37. /**
  38. * entrance
  39. *
  40. * @return {void}
  41. */
  42. async function start() {
  43. // 处理全局错误
  44. app.use(async (ctx, next) => {
  45. try {
  46. const start = +new Date();
  47. const result = await next();
  48. const spendTime = +new Date() - start;
  49. const normalTTL = 350;
  50. const requestStatus = spendTime > normalTTL ? "optimize" : "normal";
  51. log.debug(
  52. `[${requestStatus}] request [${ctx.originalUrl}] spend time is ${spendTime}ms ...`
  53. );
  54. return result;
  55. } catch (error) {
  56. // todo 做日志处理
  57. // 统一错误出口
  58. let er = error || {};
  59. ctx.status = 200;
  60. let message = er.message;
  61. if (er.code === 11000) {
  62. message = (message.match(/"(.*)"/) || [])[1] + " 名称重复,请修改!";
  63. }
  64. let stack = er.stack || er;
  65. log.error(stack);
  66. ctx.body = responseFormat.responseFormat(500, message || stack, false);
  67. }
  68. });
  69. // 设置全局变量
  70. app.use(async (ctx, next) => {
  71. global.globalConfig = {};
  72. Object.assign(global.globalConfig, {
  73. ctx: ctx,
  74. nowTime: +new Date(),
  75. // 数据库能暴露给客户端的字段,当查询条件用
  76. iconRepoExportFields:
  77. "repoId iconPrefix repoName createTime iconIds fontPath ownerId",
  78. iconExportFields: "iconId iconName iconContent ownerId",
  79. iconDraftExportFields: "iconId iconName iconContent",
  80. userExportFields: "userId userName nickName repos avatar",
  81. });
  82. await next();
  83. });
  84. // 文件上传multiple/from-data 解析到req.body
  85. app.use(
  86. koaBody({
  87. multipart: true,
  88. urlencoded: true,
  89. })
  90. );
  91. // 请求参数解析
  92. app.use(bodyParser());
  93. app.use(KoaStatic(path.join(__dirname, "public"), {}));
  94. await startServe();
  95. app.listen(config.ICON_APP_PORT, () => {
  96. log.debug(`app listen on port ${config.ICON_APP_PORT} ...`);
  97. });
  98. app.on("error", (err) => {
  99. log.error(err);
  100. process.exit(1);
  101. });
  102. }
  103. start();