mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-19 16:42:17 +03:00
9fe54bb34e
no issue - `{{#get}}` can slow down requests a lot if not used carefully, typically by using `limit="all"` or similar which can force a lot of data to be fetched and processed - adds a warning log if we detect any `{{#get}}` helper call which takes longer than a certain threshold (default 200ms) - allow log level and threshold to be configured via config to allow for different environments behaviours and requirements New config options: ``` { "logging": { "slowHelper": { "level": "warn", "threshold": 200 } } } ``` Example output for `{{#get "tags" limit="all" order="name asc"}}` with a lot of tags: ``` [2019-06-07 10:35:52] WARN {{#get}} helper took 453ms to complete {{#get}} helper took 453ms to complete Error ID: 062daed0-8910-11e9-8185-3b615ad8677d Error Code: SLOW_GET_HELPER Details: api: v2.tagsPublic.browse apiOptions: order: name asc limit: all returnedRows: 1698 ```
82 lines
2.4 KiB
JavaScript
82 lines
2.4 KiB
JavaScript
const merge = require('lodash/merge'),
|
|
each = require('lodash/each'),
|
|
util = require('util'),
|
|
errors = require('ghost-ignition').errors;
|
|
|
|
function GhostError(options) {
|
|
options = options || {};
|
|
this.value = options.value;
|
|
|
|
errors.IgnitionError.call(this, options);
|
|
}
|
|
|
|
const ghostErrors = {
|
|
DataExportError: function DataExportError(options) {
|
|
GhostError.call(this, merge({
|
|
statusCode: 500,
|
|
errorType: 'DataExportError'
|
|
}, options));
|
|
},
|
|
DataImportError: function DataImportError(options) {
|
|
GhostError.call(this, merge({
|
|
statusCode: 500,
|
|
errorType: 'DataImportError'
|
|
}, options));
|
|
},
|
|
DatabaseVersionError: function DatabaseVersionError(options) {
|
|
GhostError.call(this, merge({
|
|
hideStack: true,
|
|
statusCode: 500,
|
|
errorType: 'DatabaseVersionError'
|
|
}, options));
|
|
},
|
|
EmailError: function EmailError(options) {
|
|
GhostError.call(this, merge({
|
|
statusCode: 500,
|
|
errorType: 'EmailError'
|
|
}, options));
|
|
},
|
|
ThemeValidationError: function ThemeValidationError(options) {
|
|
GhostError.call(this, merge({
|
|
statusCode: 422,
|
|
errorType: 'ThemeValidationError',
|
|
errorDetails: {}
|
|
}, options));
|
|
},
|
|
DisabledFeatureError: function DisabledFeatureError(options) {
|
|
GhostError.call(this, merge({
|
|
statusCode: 409,
|
|
errorType: 'DisabledFeatureError'
|
|
}, options));
|
|
},
|
|
UpdateCollisionError: function UpdateCollisionError(options) {
|
|
GhostError.call(this, merge({
|
|
statusCode: 409,
|
|
errorType: 'UpdateCollisionError'
|
|
}, options));
|
|
},
|
|
HelperWarning: function HelperWarning(options) {
|
|
GhostError.call(this, merge({
|
|
errorType: 'HelperWarning',
|
|
hideStack: true
|
|
}, options));
|
|
}
|
|
};
|
|
|
|
util.inherits(GhostError, errors.IgnitionError);
|
|
each(ghostErrors, function (error) {
|
|
util.inherits(error, GhostError);
|
|
});
|
|
|
|
// we need to inherit all general errors from GhostError, otherwise we have to check instanceof IgnitionError
|
|
each(errors, function (error) {
|
|
if (error.name === 'IgnitionError' || typeof error === 'object') {
|
|
return;
|
|
}
|
|
|
|
util.inherits(error, GhostError);
|
|
});
|
|
|
|
module.exports = merge(ghostErrors, errors);
|
|
module.exports.GhostError = GhostError;
|