ssr-api.js 1.98 KB
const serviceApi = global.yoho.ServiceAPI;
const ufoAPI = global.yoho.UfoAPI;
const logger = global.yoho.logger;
const checkParams = require('../../utils/check-params');
const apiMaps = require('../../config/api-map');

module.exports = async(req, res, next) => {
  res.set({
    'Cache-Control': 'no-cache',
    Pragma: 'no-cache',
    Expires: (new Date(1900, 0, 1, 0, 0, 0, 0)).toUTCString()
  });
  const apiInfo = apiMaps[req.path];

  if (!apiInfo) {
    return next();
  }
  let baseParams;

  if (!apiInfo.service) {
    baseParams = {
      uid: (req.user && req.user.uid) ? {
        toString: () => {
          return req.user.uid || 0;
        },
        sessionKey: req.user.sessionKey,
        appSessionType: req.user.appSessionType
      } : 1,
      method: apiInfo.api
    };
  }

  try {
    const reqParams = Object.assign({}, req.query, req.body, baseParams);
    const params = checkParams.getParams(reqParams, apiInfo);
    const cache = req.method.toLowerCase() !== 'get' ? false : apiInfo.cache;
    let method = req.method.toLowerCase() === 'post' ? 'post' : 'get';

    let result;

    let apiCtx = req.ctx(global.yoho.BaseModel);

    if (apiInfo.service) {
      result = await apiCtx.get({
        api: serviceApi,
        url: `${apiInfo.api || ''}${apiInfo.path || ''}`,
        data: params,
        param: {
          cache: cache,
        }
      });
    } else if (apiInfo.ufo) {
      result = await apiCtx[method]({
        api: ufoAPI,
        url: apiInfo.path || '',
        data: params,
        param: {
          cache: cache
        }
      });
    } else {
      result = await apiCtx[method]({
        data: params,
        url: apiInfo.path || '',
        param: {
          cache: cache
        }
      });
    }
    if (result) {
      return res.json(result);
    }
    return res.json({
      code: 400
    });
  } catch (error) {
    logger.error(error);
    return res.json({
      code: error.code || 500,
      message: error.message || '服务器错误'
    });
  }
};