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('/xianyu/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 serverMiddleware = require('./doraemon/middleware/server-handler'); const errorMiddleware = require('./doraemon/middleware/error-handler'); const ssrApiMiddleware = require('./doraemon/middleware/ssr-api'); const ssrRouteMiddleware = require('./doraemon/middleware/ssr'); // YOHO 前置中间件 app.use(setYohoDataMiddleware); app.use(userMiddleware); app.use(serverMiddleware); if (!app.locals.proEnv) { app.use((req, res, next) => { if (/cordova/.test(req.url)) { return res.status(404).end(); } return next(); }); app.use('/favicon.ico', (req, res) => { res.send(''); }); app.use('/passport/login/user', (req, res) => { let result = { code: 403, message: '未登录', data: '' }; if (req.user.uid) { result.code = 200; result.message = '已登录'; result.data = req.user.uid.toString(); console.log(req.user); } res.jsonp(result); }); } app.use('/xianyu', 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 } };