const config = require('./config/common'); const path = require('path'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const yohoLib = require('yoho-node-lib'); const pkg = require('./package.json'); const devtools = require('./doraemon/middleware/devtools'); const _ = require('lodash'); // 全局注册library yohoLib.global(config); // 指定 doraemon, utils 目录 global.utils = path.resolve('./utils'); global.doraemon = path.resolve('./doraemon'); exports.createApp = async(app) => { // 向模板注入变量 app.locals.devEnv = app.get('env') === 'development'; app.locals.proEnv = app.get('env') === 'production'; app.locals.version = pkg.version; app.locals.buildId = 'web' + new Date().getTime() + '000000'; if (config.zookeeperServer) { const monitor = global.yoho.monitorSender; const monitorType = _.get(monitor, 'type.ZOOKEEPER'); require('yoho-zookeeper')(config.zookeeperServer, 'wap', app.locals.wap = {}, false, { onerror: (err) => { monitor.tallyFail(monitorType, { code: err.code, message: err.name }); } }); } app.use('/mapp/node/status.html', (req, res) => { res.status(200).end(); }); app.use(require('./doraemon/middleware/backlist')); const logger = global.yoho.logger; if (app.locals.devEnv) { app.use(devtools()); } app.use((req, res, next) => { req.isApmReport = app.locals.proEnv; next(); }); // 添加请求上下文 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: _.assign(global.yoho.helpers, require('./utils/helpers')) })); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(cookieParser()); require('./doraemon/middleware/yoho-session')(app); // dispatcher try { const userMiddleware = require('./doraemon/middleware/user'); const setYohoDataMiddleware = require('./doraemon/middleware/set-yoho-data'); const errorMiddleware = require('./doraemon/middleware/error-handler'); const ssrApiMiddleware = require('./doraemon/middleware/ssr-api'); const ssrRouteMiddleware = require('./doraemon/middleware/ssr'); const qiniuMiddleware = require('./doraemon/middleware/qiniu'); const alipayRouter = require('./doraemon/router'); // YOHO 前置中间件 app.use(setYohoDataMiddleware); app.use(userMiddleware); app.get('/mapp/getToken', qiniuMiddleware.getToken); app.post('/mapp/upload', qiniuMiddleware.upload); app.use('/mapp/alipay', alipayRouter); app.use('/mapp', ssrApiMiddleware); app.use(ssrRouteMiddleware.routers); app.all('*', ssrRouteMiddleware.ssrRender); // 404 // YOHO 后置中间件 app.use(errorMiddleware.serverError); // listener app.listen(config.port, function() { logger.info(`worker is started at http://localhost:${config.port}`); }); } catch (err) { logger.error(err); process.exit(1); //eslint-disable-line } };