set-yoho-data.js 1.55 KB
/**
 * 设置 YOHO 数据
 * @author: 赵彪<bill.zhao@yoho.cn>
 * @date: 2016/6/16
 */

'use strict';

const _ = require('lodash');
const net = require('net');

const _getClientIp = req => {
  let remoteIp = req.get('X-Yoho-Real-IP') || req.get('X-Forwarded-For') || req.get('X-Real-IP') || req.ip;

  if (remoteIp.indexOf(',') > 0) {
    let arr = remoteIp.split(',');

    remoteIp = _.trim(arr[0]);
  }

  if (_.startsWith(remoteIp, '10.66.')) {
    remoteIp = req.get('X-Real-IP');
  }

  remoteIp = _.trim(remoteIp);

  if (!net.isIPv4(remoteIp)) {
    let ipv6String = remoteIp.split(':');

    remoteIp = ipv6String[ipv6String.length - 1];
  }

  return remoteIp;
};

module.exports = (req, res, next) => {
  req.user = {}; // 全局的用户数据
  req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等

  // 判断请求是否来自app
  let userAgent = req.get('User-Agent');

  // 判断请求是否来自app
  req.yoho.isMiniApp = /miniProgram/i.test(userAgent || '') ||
      req.query.client_type === 'miniapp';
  req.yoho.isNowApp = /yohonow/i.test(userAgent || '');
  req.yoho.isMarsApp = /yohomars/i.test(userAgent || '');
  req.yoho.isYohoApp = /YohoBuy/i.test(userAgent || '');
  req.yoho.isApp = req.yoho.isMiniApp ||
      req.yoho.isNowApp ||
      req.yoho.isMarsApp ||
      req.yoho.isYohoApp;
  req.yoho.isiOS = /(iPhone|iPad|iPod|iOS)/i.test(userAgent);
  req.yoho.isAndroid = /Android/i.test(userAgent);

  // client ip
  req.yoho.clientIp = _getClientIp(req);

  Object.assign(res.locals, req.yoho);

  next();
};