78 lines
2.3 KiB
JavaScript
78 lines
2.3 KiB
JavaScript
/**
|
|
* Default 500 (Server Error) middleware
|
|
*
|
|
* If an error is thrown in a policy or controller,
|
|
* Sails will respond using this default error handler
|
|
*
|
|
* This middleware can also be invoked manually from a controller or policy:
|
|
* res.serverError( [errors] )
|
|
*
|
|
*
|
|
* @param {Array|Object|String} errors
|
|
* optional errors
|
|
*/
|
|
|
|
module.exports[500] = function serverErrorOccurred(errors, req, res) {
|
|
|
|
/*
|
|
* NOTE: This function is Sails middleware-- that means that not only do `req` and `res`
|
|
* work just like their Express equivalents to handle HTTP requests, they also simulate
|
|
* the same interface for receiving socket messages.
|
|
*/
|
|
|
|
var viewFilePath = '500',
|
|
statusCode = 500,
|
|
i, errorToLog, errorToJSON;
|
|
|
|
var result = {
|
|
status: statusCode
|
|
};
|
|
|
|
// Normalize a {String|Object|Error} or array of {String|Object|Error}
|
|
// into an array of proper, readable {Error}
|
|
var errorsToDisplay = sails.util.normalizeErrors(errors);
|
|
for (i in errorsToDisplay) {
|
|
|
|
// Log error(s) as clean `stack`
|
|
// (avoids ending up with \n, etc.)
|
|
if ( errorsToDisplay[i].original ) {
|
|
errorToLog = sails.util.inspect(errorsToDisplay[i].original);
|
|
}
|
|
else {
|
|
errorToLog = errorsToDisplay[i].stack;
|
|
}
|
|
sails.log.error('Server Error (500)');
|
|
sails.log.error(errorToLog);
|
|
|
|
// Use original error if it exists
|
|
errorToJSON = errorsToDisplay[i].original || errorsToDisplay[i].message;
|
|
errorsToDisplay[i] = errorToJSON;
|
|
}
|
|
|
|
// Only include errors if application environment is set to 'development'
|
|
// In production, don't display any identifying information about the error(s)
|
|
if (sails.config.environment === 'development') {
|
|
result.errors = errorsToDisplay;
|
|
}
|
|
|
|
// If the user-agent wants JSON, respond with JSON
|
|
if (req.wantsJSON) {
|
|
return res.json(result, result.status);
|
|
}
|
|
|
|
// Set status code and view locals
|
|
res.status(result.status);
|
|
for (var key in result) {
|
|
res.locals[key] = result[key];
|
|
}
|
|
// And render view
|
|
res.render(viewFilePath, result, function (err) {
|
|
// If the view doesn't exist, or an error occured, just send JSON
|
|
if (err) { return res.json(result, result.status); }
|
|
|
|
// Otherwise, if it can be rendered, the `views/500.*` page is rendered
|
|
res.render(viewFilePath, result);
|
|
});
|
|
|
|
};
|