express-init.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. 'use strict';
  2. module.exports = function(crowi, app) {
  3. var debug = require('debug')('crowi:crowi:express-init')
  4. , path = require('path')
  5. , express = require('express')
  6. , bodyParser = require('body-parser')
  7. , cookieParser = require('cookie-parser')
  8. , methodOverride = require('method-override')
  9. , session = require('express-session')
  10. , basicAuth = require('basic-auth-connect')
  11. , flash = require('connect-flash')
  12. , cons = require('consolidate')
  13. , swig = require('swig')
  14. , webpackAssets = require('express-webpack-assets')
  15. , i18next = require('i18next')
  16. , i18nFsBackend = require('i18next-node-fs-backend')
  17. , i18nSprintf = require('i18next-sprintf-postprocessor')
  18. , i18nMiddleware = require('i18next-express-middleware')
  19. , i18nUserSettingDetector = require('../util/i18nUserSettingDetector')
  20. , env = crowi.node_env
  21. , middleware = require('../util/middlewares')
  22. , User = crowi.model('User')
  23. ;
  24. var lngDetector = new i18nMiddleware.LanguageDetector();
  25. lngDetector.addDetector(i18nUserSettingDetector);
  26. i18next
  27. .use(lngDetector)
  28. .use(i18nFsBackend)
  29. .use(i18nSprintf)
  30. .init({
  31. // debug: true,
  32. fallbackLng: [User.LANG_EN_US],
  33. whitelist: Object.keys(User.getLanguageLabels()).map((k) => User[k]),
  34. backend: {
  35. loadPath: crowi.localeDir + '{{lng}}/translation.json'
  36. },
  37. detection: {
  38. order: ['userSettingDetector', 'header', 'navigator'],
  39. },
  40. overloadTranslationOptionHandler: i18nSprintf.overloadTranslationOptionHandler
  41. });
  42. app.use(function(req, res, next) {
  43. var now = new Date()
  44. , baseUrl
  45. , config = crowi.getConfig()
  46. , tzoffset = -(config.crowi['app:timezone'] || 9) * 60 // for datez
  47. , Page = crowi.model('Page')
  48. , User = crowi.model('User')
  49. , Config = crowi.model('Config')
  50. ;
  51. app.set('tzoffset', tzoffset);
  52. req.config = config;
  53. req.csrfToken = null;
  54. config.crowi['app:url'] = baseUrl = (req.headers['x-forwarded-proto'] == 'https' ? 'https' : req.protocol) + '://' + req.get('host');
  55. res.locals.req = req;
  56. res.locals.baseUrl = baseUrl;
  57. res.locals.config = config;
  58. res.locals.env = env;
  59. res.locals.now = now;
  60. res.locals.tzoffset = tzoffset;
  61. res.locals.consts = {
  62. pageGrants: Page.getGrantLabels(),
  63. userStatus: User.getUserStatusLabels(),
  64. language: User.getLanguageLabels(),
  65. restrictGuestMode: Config.getRestrictGuestModeLabels(),
  66. registrationMode: Config.getRegistrationModeLabels(),
  67. };
  68. res.locals.local_config = Config.getLocalconfig(config); // config for browser context
  69. next();
  70. });
  71. app.set('port', crowi.port);
  72. const staticOption = (crowi.node_env === 'production') ? {maxAge:'30d'} : {};
  73. app.use(express.static(crowi.publicDir, staticOption));
  74. app.engine('html', cons.swig);
  75. app.use(webpackAssets(
  76. path.join(crowi.publicDir, 'js/webpack-assets.json'),
  77. { devMode: (crowi.node_env === 'development') })
  78. );
  79. // app.set('view cache', false); // Default: true in production, otherwise undefined. -- 2017.07.04 Yuki Takei
  80. app.set('view engine', 'html');
  81. app.set('views', crowi.viewsDir);
  82. app.use(methodOverride());
  83. app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));
  84. app.use(bodyParser.json({limit: '50mb'}));
  85. app.use(cookieParser());
  86. app.use(session(crowi.sessionConfig));
  87. // Set basic auth middleware
  88. app.use(function(req, res, next) {
  89. var config = crowi.getConfig();
  90. if (req.query.access_token || req.body.access_token) {
  91. return next();
  92. }
  93. if (config.crowi['security:basicName'] && config.crowi['security:basicSecret']) {
  94. return basicAuth(
  95. config.crowi['security:basicName'],
  96. config.crowi['security:basicSecret'])(req, res, next);
  97. } else {
  98. next();
  99. }
  100. });
  101. app.use(flash());
  102. app.use(middleware.swigFilters(app, swig));
  103. app.use(middleware.swigFunctions(crowi, app));
  104. app.use(middleware.loginChecker(crowi, app));
  105. app.use(i18nMiddleware.handle(i18next));
  106. };