/** * yohobuy app * @author: xuqi<qi.xu@yoho.cn> * @date: 2016/4/25 */ 'use strict'; // if (process.env.USE_APM === '1' && process.env.NODE_ENV === 'production') { // require('oneapm'); // } const config = require('./config/common'); global.Promise = require('bluebird'); const yohoLib = require('yoho-node-lib'); // 全局注册library yohoLib.global(config); const express = require('express'); const compression = require('compression'); const path = require('path'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const favicon = require('serve-favicon'); const _ = require('lodash'); const fp = require('lodash/fp'); const pkg = require('./package.json'); const hbsEvent = require('./config/hbsevent'); const app = express(); const helpers = global.yoho.helpers; app.disable('x-powered-by'); // tdk global.yoho.redis = require('./doraemon/middleware/redis'); const tdk = require('./utils/getTDK'); // NOTE: 这里修改了图片质量的参数 helpers.image = _.flow(helpers.image, fp.replace(/\/quality\/\d*$/, '/quality/90')); // NOTE:这里修改了参数的个数 helpers.getUrlBySkc = skn => `//www.yohobuy.com/product/${skn}.html`; global.middleware = path.resolve('./doraemon/middleware'); global.utils = path.resolve('./utils'); global.appRoot = path.resolve(__dirname); // 向模板注入变量 global.devEnv = app.locals.devEnv = app.get('env') === 'development'; global.isProduction = app.locals.isProduction = app.get('env') === 'production'; global.version = app.locals.version = pkg.version; // zookeeper if (config.zookeeperServer) { const monitor = global.yoho.monitorSender; const monitorType = _.get(monitor, 'type.ZOOKEEPER'); require('yoho-zookeeper')(config.zookeeperServer, 'pc', app.locals.pc = {}, global.yoho.cache, { onerror: (err) => { monitor.tallyFail(monitorType, { code: err.code, message: err.name }); } }); } app.enable('trust proxy'); app.set('subdomain offset', 2); app.use((req, res, next) => { req.isApmReport = _.get(req.app.locals, 'pc.open.bughd', false); next(); }); app.use(favicon(path.join(__dirname, '/favicon.ico'))); app.use(express.static(path.join(__dirname, 'static'))); // 添加请求上下文 app.use(global.yoho.httpCtx()); app.use(global.yoho.hbs({ extname: '.hbs', defaultLayout: 'layout', layoutsDir: path.join(__dirname, 'doraemon/views'), partialsDir: path.join(__dirname, 'doraemon/views/partial'), views: path.join(__dirname, 'doraemon/views'), helpers: Object.assign(global.yoho.helpers, require('./utils/helpers')), cb: hbsEvent.cb })); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false})); app.use(cookieParser()); app.use(compression()); // session 设置 require('./doraemon/middleware/yoho-session')(app); app.use((req, res, next) => { req.user = {}; // 全局的用户数据 req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等 if (!req.session) { req.session = {}; } res.locals.nowYear = new Date().getFullYear(); // req.app.locals = _.merge(req.app.locals, { // pc: { // geetest: { // validation: true // } // } // }); next(); }); // redis seo app.use((req, res, next) => { if (!req.xhr) { tdk('url', `${req.hostname}${req.originalUrl}`, req).then(TDKObj =>{ if (TDKObj[0]) { req.tdk = { title: TDKObj[1], keywords: TDKObj[2], description: TDKObj[3] }; } next(); }); } else { return next(); } }); const logger = global.yoho.logger; function isOpenApmRisk(req) { return _.get(req.app.locals, 'pc.open.apmrisk', false); } // dispatcher try { const setYohoData = require('./doraemon/middleware/set-yoho-data'); const riskManagement = require('./doraemon/middleware/risk-management'); const riskManagementApm = require('./doraemon/middleware/risk-management2'); const htaccess = require('./doraemon/middleware/htaccess'); const subDomain = require('./doraemon/middleware/sub-domain'); const mobileRefer = require('./doraemon/middleware/mobile-refer'); const mobileCheck = require('./doraemon/middleware/mobile-check'); const user = require('./doraemon/middleware/user'); const seo = require('./doraemon/middleware/seo'); const errorHandler = require('./doraemon/middleware/error-handler'); const setPageInfo = require('./doraemon/middleware/set-pageinfo'); const layoutTools = require('./doraemon/middleware/layout-tools'); const pageCache = require('./doraemon/middleware/page-cache'); const devtool = require('./doraemon/middleware/devtools'); const routeEncode = require('./doraemon/middleware/route-encode'); const footerData = require('./doraemon/middleware/footerData'); const ifElseMd = require('./doraemon/middleware/ifElseMd'); const lang = require('./doraemon/middleware/lang'); // YOHO 前置中间件 app.use(lang); app.use(setYohoData()); app.use(ifElseMd(isOpenApmRisk, riskManagementApm(), riskManagement())); app.use(seo()); app.use(htaccess()); app.use(subDomain()); app.use(mobileRefer()); app.use(mobileCheck()); app.use(user()); // 请求限制中间件 if (!app.locals.devEnv) { const limiter = require('./doraemon/middleware/limiter'); const limiterApm = require('./doraemon/middleware/limiter/index2'); app.use(ifElseMd(isOpenApmRisk, limiterApm, limiter)); } app.use(setPageInfo()); app.use(layoutTools()); app.use(pageCache()); app.use(routeEncode.md); app.use(footerData()); if (app.locals.devEnv) { app.use(devtool()); } require('./dispatch')(app); app.use('/crm/common/ok.jsp', (req, res) => { res.status(200).end(); }); app.all('*', errorHandler.notFound()); // 404 // YOHO 后置中间件 app.use(errorHandler.serverError()); } catch (err) { logger.error(err); } // listener app.listen(config.port, function() { logger.info('yohobuy start'); hbsEvent.event.on('hbs-complete', () => { process.send && process.send('ready'); logger.info('hbs-all-complete'); }); });