api.js 2.5 KB
/**
 * 接口公共方法
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2016/4/25
 */

'use strict';

const rp = require('request-promise');
const _ = require('lodash');
const log = require('./logger');
const api = require('../config/common').domains.api;
const Timer = require('./timer');

/**
 * 日志打印
 * @param {Object} requestPromise 请求的promise对象
 */
function logPrint(options, requestPromise) {

    // 接口统计
    let timer = new Timer();

    timer.put('getApi');// 统计时间开始

    let method = options.method ? options.method : 'get';

    log.info('API Begin %s call: %s, parms: %j',
        method, options.url, options.qs, {});
    requestPromise.then((body) => {
        let duration = timer.put('getApi');// 接口返回

        log.info('API %s res: %s, parms: %j , durationMs: %d ms , body: %s',
            method, options.url, options.qs, duration, body);
    }).catch((error) => {
        let duration = timer.put('getApi');// 接口返回

        log.error('API %s res: %s, parms: %j , durationMs: %d ms error: %s , statusCode: %d',
            method, options.url, options.qs, duration, error.message, error.statusCode);
    });
}


let ApiUrl;

class API {

    constructor(url) {
        ApiUrl = url || api;
    }

    /**
     * get
     * @param url String
     * @param data Obejct
     */
    get(url, data) {

        let options = {
            url: `${ApiUrl}${url}`,
            qs: data,
            json: true
        };

        let requestPromise = rp(options);

        logPrint(options, requestPromise);// 日志打印

        return requestPromise;
    }

    /**
     * multi get
     * @params: urls => Array[Object[url[string], data[object]]]
     */
    multiGet(urls) {
        let rps = [];

        _.forEach(urls, function(el) {
            let options = {
                url: `${ApiUrl}${el.url}`,
                qs: el.data
            };

            let requestPromise = rp(options);

            logPrint(options, requestPromise);// 打印日志

            rps.push(requestPromise);
        });

        return Promise.all(rps).then((d) => {
            return d;
        });
    }

    /**
     * post
     * @param url String
     * @param data Obejct
     */
    post(url, data) {
        let options = {
            url: `${ApiUrl}${url}`,
            method: 'post',
            form: data
        };

        let requestPromise = rp(options);

        logPrint(options, requestPromise);// 打印日志

        return requestPromise;
    }
}

module.exports = API;