error-handler.js 1.75 KB
/**
 * error处理
 * @author: leo<qi.li@yoho.cn>
 * @date: 2017/06/23
 */
const _ = require('lodash');
const logger = global.yoho.logger;
const sender = global.yoho.apmSender;
const hostname = require('os').hostname();

const serverError = (err, req, res, next) => { // eslint-disable-line
    logger.error(err);
    let code = 500, msg = '服务器错误!';

    if (err.code && typeof err.code === 'number' && err.code !== 500 && err.message && !/_ERROR/.test(err.message)) {
        code = err.code;
        msg = err.message;
    }

    if (req.isApmReport && !err.apiError) {
        try {
            sender.addMessage({
                measurement: 'error-report',
                tags: {
                    app: global.yoho.config.appName, // 应用名称
                    hostname,
                    type: 'server',
                    route: `[${req.method}]${req.route && req.route.path}`, // 请求路由
                    reqID: req.reqID || '',
                    code: err.code || 500,
                    url: encodeURIComponent(req.originalUrl),
                    ip: _.get(req, 'yoho.clientIp', '')
                },
                fields: {
                    message: err.message,
                    stack: err.stack,
                    useragent: req && req.get('user-agent')
                }
            });
        } catch(e) {} // eslint-disable-line
    }

    return res.status(code).json({
        code: code,
        message: msg
    });
};


const notFound = (req, res) => {
    res.status(404);

    if (req.xhr) {
        return res.json({
            code: 404,
            message: '请求路径不存在'
        });
    }

    res.render('error/404', {
        layout: false
    });
};

module.exports = {
    notFound,
    serverError
};