...
|
...
|
@@ -4,11 +4,14 @@ |
|
|
*/
|
|
|
const headerModel = require('../models/header');
|
|
|
const logger = global.yoho.logger;
|
|
|
const cache = global.yoho.cache.master;
|
|
|
const helpers = global.yoho.helpers;
|
|
|
const sender = global.yoho.apmSender;
|
|
|
const config = global.yoho.config;
|
|
|
const hostname = require('os').hostname();
|
|
|
const routeEncode = require('./route-encode');
|
|
|
const _ = require('lodash');
|
|
|
const limiterIpTime = 3600;
|
|
|
|
|
|
const forceNoCache = (res) => {
|
|
|
if (res) {
|
...
|
...
|
@@ -48,13 +51,20 @@ exports.notFound = () => { |
|
|
* @return {[type]}
|
|
|
*/
|
|
|
exports.serverError = () => {
|
|
|
return (err, req, res, next) => {
|
|
|
return async (err, req, res, next) => {
|
|
|
forceNoCache(res);
|
|
|
|
|
|
const uid = req.user ? req.user.uid : 0;
|
|
|
const udid = _.get(req, 'cookies.udid', 'yoho');
|
|
|
let errorCode = 500;
|
|
|
|
|
|
if (req.isApmReport) {
|
|
|
err = err || {
|
|
|
code: 500
|
|
|
};
|
|
|
|
|
|
err.code = err.code || err.statusCode || 500;
|
|
|
|
|
|
if (req.isApmReport && !err.apiError) { // apierror在node lib中已经上报过了 不需要再次上报
|
|
|
// 上报服务端错误
|
|
|
sender.addMessage({
|
|
|
measurement: 'error-report',
|
...
|
...
|
@@ -79,7 +89,7 @@ exports.serverError = () => { |
|
|
logger.error(`error at path: ${req.url}`);
|
|
|
logger.error(err);
|
|
|
|
|
|
if (err && err.code === 401) {
|
|
|
if (err.code === 401) {
|
|
|
if (req.xhr) {
|
|
|
err.data = {refer: helpers.urlFormat('/signin.html', {refer: req.get('Referer') || ''})};
|
|
|
return res.json(err);
|
...
|
...
|
@@ -87,11 +97,41 @@ exports.serverError = () => { |
|
|
return res.redirect(helpers.urlFormat('/signin.html', {refer: req.fullUrl()}));
|
|
|
}
|
|
|
}
|
|
|
if (err.code === 9999991 || err.code === 9999992) {
|
|
|
let remoteIp = req.yoho.clientIp;
|
|
|
|
|
|
const isHuman = await cache.getAsync(`${config.app}:limiter:api:ishuman:${remoteIp}`);
|
|
|
|
|
|
if (!isHuman) {
|
|
|
if (remoteIp.indexOf(',') > 0) {
|
|
|
let arr = remoteIp.split(',');
|
|
|
|
|
|
remoteIp = arr[0];
|
|
|
}
|
|
|
cache.setAsync(`${config.app}:limiter:${remoteIp}`, 1, limiterIpTime);
|
|
|
|
|
|
let limitAPI = helpers.urlFormat('/3party/check', {refer: req.get('Referer') || ''});
|
|
|
let limitPage = helpers.urlFormat('/3party/check', {
|
|
|
refer: req.protocol + '://' + req.get('host') + req.originalUrl
|
|
|
});
|
|
|
|
|
|
req.session.apiLimitValidate = true;
|
|
|
if (req.xhr) {
|
|
|
return res.status(510).json({
|
|
|
code: err.code,
|
|
|
data: {refer: limitAPI}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return res.redirect(limitPage);
|
|
|
}
|
|
|
errorCode = 510;
|
|
|
}
|
|
|
|
|
|
if (!res.headersSent) {
|
|
|
if (req.xhr) {
|
|
|
return res.status(500).json({
|
|
|
code: 500,
|
|
|
return res.status(errorCode).json({
|
|
|
code: errorCode,
|
|
|
message: '服务器错误!'
|
|
|
});
|
|
|
}
|
...
|
...
|
@@ -99,7 +139,7 @@ exports.serverError = () => { |
|
|
const renderErrPage = (result) => {
|
|
|
result = result || {};
|
|
|
|
|
|
res.status(500).render('error/500', {
|
|
|
res.status(errorCode).render(`error/${errorCode}`, {
|
|
|
module: 'common',
|
|
|
page: 'error',
|
|
|
err: err,
|
...
|
...
|
|