express-init.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. module.exports = function(crowi, app) {
  2. const debug = require('debug')('growi:crowi:express-init');
  3. const path = require('path');
  4. const express = require('express');
  5. const helmet = require('helmet');
  6. const bodyParser = require('body-parser');
  7. const cookieParser = require('cookie-parser');
  8. const methodOverride = require('method-override');
  9. const passport = require('passport');
  10. const expressSession = require('express-session');
  11. const flash = require('connect-flash');
  12. const swig = require('swig-templates');
  13. const webpackAssets = require('express-webpack-assets');
  14. const i18next = require('i18next');
  15. const i18nFsBackend = require('i18next-node-fs-backend');
  16. const i18nSprintf = require('i18next-sprintf-postprocessor');
  17. const i18nMiddleware = require('i18next-express-middleware');
  18. const registerSafeRedirect = require('../middleware/safe-redirect')();
  19. const avoidSessionRoutes = require('../routes/avoid-session-routes');
  20. const i18nUserSettingDetector = require('../util/i18nUserSettingDetector');
  21. const env = crowi.node_env;
  22. const User = crowi.model('User');
  23. const lngDetector = new i18nMiddleware.LanguageDetector();
  24. lngDetector.addDetector(i18nUserSettingDetector);
  25. i18next
  26. .use(lngDetector)
  27. .use(i18nFsBackend)
  28. .use(i18nSprintf)
  29. .init({
  30. // debug: true,
  31. fallbackLng: [User.LANG_EN_US],
  32. whitelist: Object.keys(User.getLanguageLabels()).map((k) => { return User[k] }),
  33. backend: {
  34. loadPath: `${crowi.localeDir}{{lng}}/translation.json`,
  35. },
  36. detection: {
  37. order: ['userSettingDetector', 'header', 'navigator'],
  38. },
  39. overloadTranslationOptionHandler: i18nSprintf.overloadTranslationOptionHandler,
  40. // change nsSeparator from ':' to '::' because ':' is used in config keys and these are used in i18n keys
  41. nsSeparator: '::',
  42. });
  43. app.use(helmet());
  44. app.use((req, res, next) => {
  45. const now = new Date();
  46. // for datez
  47. const Page = crowi.model('Page');
  48. const User = crowi.model('User');
  49. const Config = crowi.model('Config');
  50. app.set('tzoffset', crowi.appService.getTzoffset());
  51. req.csrfToken = null;
  52. res.locals.req = req;
  53. res.locals.baseUrl = crowi.appService.getSiteUrl();
  54. res.locals.env = env;
  55. res.locals.now = now;
  56. res.locals.consts = {
  57. pageGrants: Page.getGrantLabels(),
  58. userStatus: User.getUserStatusLabels(),
  59. language: User.getLanguageLabels(),
  60. restrictGuestMode: crowi.aclService.getRestrictGuestModeLabels(),
  61. registrationMode: crowi.aclService.getRegistrationModeLabels(),
  62. };
  63. res.locals.local_config = Config.getLocalconfig(); // config for browser context
  64. next();
  65. });
  66. app.set('port', crowi.port);
  67. const staticOption = (crowi.node_env === 'production') ? { maxAge: '30d' } : {};
  68. app.use(express.static(crowi.publicDir, staticOption));
  69. app.engine('html', swig.renderFile);
  70. app.use(webpackAssets(
  71. path.join(crowi.publicDir, 'manifest.json'),
  72. { devMode: (crowi.node_env === 'development') },
  73. ));
  74. // app.set('view cache', false); // Default: true in production, otherwise undefined. -- 2017.07.04 Yuki Takei
  75. app.set('view engine', 'html');
  76. app.set('views', crowi.viewsDir);
  77. app.use(methodOverride());
  78. app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));
  79. app.use(bodyParser.json({ limit: '50mb' }));
  80. app.use(cookieParser());
  81. // configure express-session
  82. const sessionMiddleware = expressSession(crowi.sessionConfig);
  83. app.use((req, res, next) => {
  84. // test whether the route is listed in avoidSessionRoutes
  85. for (const regex of avoidSessionRoutes) {
  86. if (regex.test(req.path)) {
  87. return next();
  88. }
  89. }
  90. sessionMiddleware(req, res, next);
  91. });
  92. // passport
  93. debug('initialize Passport');
  94. app.use(passport.initialize());
  95. app.use(passport.session());
  96. app.use(flash());
  97. app.use(registerSafeRedirect);
  98. const middlewares = require('../util/middlewares')(crowi, app);
  99. app.use(middlewares.swigFilters(swig));
  100. app.use(middlewares.swigFunctions());
  101. app.use(middlewares.csrfKeyGenerator());
  102. app.use(middlewares.loginCheckerForPassport);
  103. app.use(i18nMiddleware.handle(i18next));
  104. };