@gospime/koa-reply
Version:
Generate result and send to customer
87 lines (68 loc) • 2.1 kB
JavaScript
const debug = require('debug')('@gospime/koa-reply');
/*
type BoomifiedError = Error & {
isBoom?: boolean,
status?: number,
statusCode: number,
message?: string,
data?: Object,
output?: {
statusCode?: number,
payload?: {
message?: string
}
}
};
*/
const parseError = (error/*: BoomifiedError*/ = null, context) => {
if (typeof context !== 'object') throw new TypeError('Invalid context');
if (error) {
debug('Catched error: ', error);
if (typeof context.log === 'object' && typeof context.log.error === 'function') {
context.log.error(error);
} else {
context.error(error);
}
}
const result = {};
if (error instanceof Error) {
if (error.isBoom) {
result.code = error.output.statusCode || error.statusCode;
result.message = error.output.payload.message || error.message;
result.data = error.data;
} else {
result.code = error.status || error.statusCode || 500;
result.message = error.message || 'An internal server error has occured';
}
}
return result;
};
module.exports = async (context, next) => {
if (typeof context !== 'object') throw new TypeError('Invalid context');
context.reply = ({ error, statusCode, message, payload }) => {
if (context.headerSent) return next(error);
if (error) {
const errorData = parseError(error, context);
if (errorData && typeof errorData === 'object') {
if (errorData.code) statusCode = errorData.code;
if (errorData.message) message = errorData.message;
if (errorData.data) payload = errorData.data;
}
}
statusCode = parseInt(statusCode) || 200;
if (!message || typeof message !== 'string') {
message = 'Successfully completed';
}
if (!payload || typeof payload !== 'object') {
payload = null;
}
const result = { statusCode, message, payload };
debug('Result:', result);
if (result.statusCode !== context.status) {
context.status = result.statusCode;
}
// $FlowFixMe
context.body = result;
};
await next();
};