abstract-action.js 1.66 KB
/**
 * AbstractAction
 *
 * @author: Aiden Xu<aiden.xu@yoho.cn>
 * @date: 2016/7/11
 */
'use strict';

const _ = require('lodash');
const Promise = require('bluebird');

class AbstractAction {
    constructor(req, res, next) {
        if (!req || !res) {
            throw new Error('Request and response object must be specified.');
        }

        this.request = req;
        this.response = res;
        this.next = next;
        this.renderContext = {};
    }

    echoJson(json) {
        this.response.set('Content-Type', 'application/json; charset=utf-8;');
        this.response.json(json);
    }

    /**
     * 判断是否是AJAX请求
     *
     * @return boolean 如果是AJAX请求返回 true
     */
    isAjax() {
        return this.request.header('X-Requested-With') === 'XMLHttpRequest';
    }


    /**
     * 设置入口
     *
     * @param module 模块名称
     * @param entry 入口名称
     */
    setEntry(module, entry) {
        _.merge(this.renderContext, {
            module: module,
            page: entry
        });
    }

    /**
     * 渲染视图
     *
     * @param template 模版名称
     * @param context 上下文
     */
    renderTemplate(template, context) {
        this.response.render(template, _.merge({}, this.renderContext, context));
    }

    /**
     * 内部渲染方法,该方法应该由 ActionCreator 来调用
     *
     * @returns Promise
     */
    _render() {
        return this.render();
    }

    /**
     * 渲染回调方法
     *
     * @returns Promise
     */
    render() {
        return new Promise(function(resolve) {
            return resolve();
        });
    }
}

module.exports = AbstractAction;