create-app.js
4.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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');
const uuid = require('uuid');
// 全局注册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.set('etag', false);
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.get('/xianyu/app/ufo/getServerTime', function(req, res) {
return res.json({
code: 200,
data: Date.now()
});
});
// 添加请求上下文
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);
app.use((req, res, next) => {
// 独立的 UDID
if (!req.cookies.udid || (req.yoho.isApp && req.query.udid)) {
let udid = uuid.v4();
if (req.yoho.isApp && req.query.udid) {
udid = req.query.udid;
}
res.cookie('udid', udid, {
domain: 'yohobuy.com',
expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)
});
req.cookies.udid = udid;
}
next();
});
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.post('/xianyu/config', (req, res) => {
res.json({
code: 200,
data: _.get(req.app.locals.wap, 'xianyu', {})
});
});
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
}
};