error-handler.js 2.17 KB
/**
 * 异常处理中间件
 * @author: bikai<bikai@yoho.cn>
 * @date: 2016/4/25
 */

'use strict';

const headerModel = require('../models/header');
const logger = global.yoho.logger;
const helpers = global.yoho.helpers;

/**
 * 404 错误
 * @return {[type]}
 */
exports.notFound = () => {
    return (req, res) => {
        if (req.xhr) {
            return res.status(404).json({
                code: 404,
                message: '抱歉,页面不存在!'
            });
        }

        return res.status(404).display('error/404', {
            module: 'common',
            page: 'error',
            title: '页面不存在 | Yoho!BLK | 潮流购物逛不停'
        });

    };
};

/**
 * 服务器错误
 * @return {[type]}
 */
exports.serverError = () => {
    return (err, req, res, next) => {
        if (err && err.code === 401) {
            logger.error(`401 error info:client_type=${req.query.client_type},req.user=${JSON.stringify(req.user)},req.query=${JSON.stringify(req.query)},cookies=${JSON.stringify(req.cookies)}`); // eslint-disable-line

            if (req.xhr) {
                return res.status(401).json(err);
            } else {
                return res.redirect(helpers.urlFormat('/passport/login', {
                    refer: req.originalUrl
                }));
            }
        }
        logger.error(`error at path: ${req.url}`);
        logger.error(err);
        if (!res.headersSent) {
            if (req.xhr) {
                return res.status(500).json({
                    code: 500,
                    message: '服务器错误!'
                });
            }

            const renderErrPage = (result) => {
                res.status(500).display('error/500', {
                    module: 'common',
                    page: 'error',
                    err: err,
                    title: '服务器错误 | Yoho!Buy有货 | 潮流购物逛不停',
                    headerData: (result ? result.headerData : {})
                });
            };

            return headerModel.requestHeaderData(req.yoho.channel).then(renderErrPage).catch(() => {
                renderErrPage();
            });
        }
        next(err);
    };
};