let express = require('express');
let path = require('path');
let favicon = require('serve-favicon');
let logger = require('morgan');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
let session = require('express-session');
const { v4: uuidv4 } = require('uuid');
const { AsyncLocalStorage } = require('async_hooks');
let app = express();
const asyncLocalStorage = new AsyncLocalStorage();
// view engine setup
app.set('views', [path.join(__dirname, 'views'), path.join(__dirname, 'views-dust')]);
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('common'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
resave: false, //添加 resave 选项
saveUninitialized: true, //添加 saveUninitialized 选项
secret: '12345'
// ,
// secure: true,
// httpOnly: true,
// sameSite: 'none'
}));
// 跨域设置
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", req.header("Origin"));
res.header("Access-Control-Allow-Headers", "Content-Type, Origin, Man, Messagetype, Soapaction, X-Test-Header");
res.header("Access-Control-Allow-Methods", "*");
res.header("Access-Control-Allow-Credentials", "true");
res.header("Allow", "PUT,POST,GET,DELETE,OPTIONS");
next();
});
// 重写 console.log 函数
const originalConsoleLog = console.log;
console.log = (...args) => {
const store = asyncLocalStorage.getStore();
const requestId = store ? store.get('requestId') : 'no-request-id';
originalConsoleLog.apply(console, [`${requestId}`, ...args]);
};
// 创建一个中间件来获取或生成 X-Request-Id 并存储在 AsyncLocalStorage
app.use((req, res, next) => {
const requestId = req.headers['x-request-id'] || uuidv4();
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('requestId', requestId);
next();
});
});
//RootPath
let routes = require('./routes/index');
app.use('/', routes);
// CAS方式强制使用令牌登录(使用中)
let route_auth_token = require('./routes/auth/auth_token_cas');
app.use('/doucas', route_auth_token);
// (使用中)
let route_auth_index = require("./routes/auth/index");
app.use('/', route_auth_index);
/** IP及工具类功能入口 功能OK */
let route_xadm = require('./routes/xadm/home');
app.use('/yifeng/xadm', route_xadm);
/** 重置密码功能入口 功能OK */
let route_reset = require('./routes/reset/home');
app.use('/dust/reset', route_reset);
/** 机器人客服入口 */
let route_bot = require('./routes/botservice/bothome');
app.use("/bot/service", route_bot);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// 以下为以上逻辑的改进版本
app.use(function (err, req, res, next) {
// 如果响应头已经被发送,就不要再次设置状态码或发送响应
if (res.headersSent) {
return next(err);
}
res.status(err.status || 500);
let env = app.get('env') || 'development';
let error = {};
if (env === 'development') error = err;
res.render('error', {
message: err.message,
error: error
});
});
// -----------------重写向检测-----------------
// 定义一个中间件函数来检查重定向次数和清除Cookie
const checkRedirectsAndClearCookies = (req, res, next) => {
let rUser = req.cookies['INNER_AUTHENTICATION'];
if (rUser == undefined) { rUser = ""; }
// ZPSSO有登录用户的情况下
if (rUser.length > 10) {
// 如果重定向客户端标记30秒过期
const expireRedirectTime = new Date().setTime(new Date().getTime() + 1000 * 30);
// 如果重定向次数超过3次,则清除.zhaopin.com除了"zpsso"之外的所有Cookie
let rCount = req.cookies['INNER_REDIRECT_COUNT'];
if (rCount == undefined) { rCount = 0; } else { rCount++; }
if (rCount > 3) {
// 定义一个数组来存储需要保留的Cookie的key
const cookiesToKeep = ['_V',
'INNER_AUTHENTICATION',
'INNER_REDIRECT_COUNT',
'sso_cookie'];
const cookies = req.cookies;
for (const cookie in cookies) {
if (!cookiesToKeep.includes(cookie)) {
res.clearCookie(cookie);
}
}
res.append('Set-Cookie', `INNER_REDIRECT_COUNT=${rCount}; domain=.zhaopin.com;expires=${(new Date(expireRedirectTime)).toUTCString()}; `);
} else {
res.append('Set-Cookie', `INNER_REDIRECT_COUNT=${rCount}; domain=.zhaopin.com;expires=${(new Date(expireRedirectTime)).toUTCString()}; `);
next(); // 继续执行下一个中间件或路由处理程序
}
}
};
// 将中间件函数应用于所有路由
// app.use(checkRedirectsAndClearCookies);
// -----------------重写向检测-----------------
const startQ = require("./utility/startQ");
startQ.startQ();
startQ.loadIps();
module.exports = app;