app.js

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;