Files
cnpmcore/app/port/middleware/ErrorHandler.ts
fengmk2 4427a4fca5 feat: use egg v4 (#747)
BREAKING CHANGE: only support egg >= 4.0.0

the first app on egg v4

https://github.com/eggjs/egg/issues/3644
2025-02-09 15:43:24 +08:00

61 lines
2.3 KiB
TypeScript

import { EggContext, Next } from '@eggjs/tegg';
import { PackageSyncerService } from '../../core/service/PackageSyncerService';
const DEFAULT_SERVER_ERROR_STATUS = 500;
export async function ErrorHandler(ctx: EggContext, next: Next) {
try {
await next();
} catch (err: any) {
if (err.name === 'PackageNotFoundError') {
if (err.syncPackage) {
// create sync task
const syncPackage = err.syncPackage;
const packageSyncerService = await ctx.getEggObject(PackageSyncerService);
const task = await packageSyncerService.createTask(syncPackage.fullname, {
authorIp: ctx.ip,
authorId: ctx.userId as string,
tips: `Sync cause by "${syncPackage.fullname}" missing, request URL "${ctx.href}"`,
});
ctx.logger.info('[middleware:ErrorHandler][syncPackage] create sync package "%s" task %s',
syncPackage.fullname, task.taskId);
}
if (err.redirectToSourceRegistry) {
// redirect to sourceRegistry
ctx.redirect(`${err.redirectToSourceRegistry}${ctx.url}`);
return;
}
} else if (err.name === 'ControllerRedirectError' && err.location) {
ctx.redirect(err.location);
return;
}
// http status, default is DEFAULT_SERVER_ERROR_STATUS
ctx.status = (typeof err.status === 'number' && err.status >= 200) ? err.status : DEFAULT_SERVER_ERROR_STATUS;
// don't log NotImplementedError
if (ctx.status >= DEFAULT_SERVER_ERROR_STATUS && err.name !== 'NotImplementedError') {
ctx.logger.error(err);
}
let message = err.message;
// convert ctx.tValidate error
if (err.name === 'UnprocessableEntityError' && err.currentSchema && err.errors[0]?.message) {
// {
// instancePath: '/password',
// schemaPath: '#/properties/password/minLength',
// keyword: 'minLength',
// message: 'must NOT have fewer than 8 characters'
// }
const item = err.errors[0];
if (item.instancePath) {
message = `${item.instancePath.substring(1)}: ${item.message}`;
} else {
message = item.message;
}
}
// error body format https://github.com/npm/npm-registry-fetch/blob/main/errors.js#L45
ctx.body = {
error: err.code ? `[${String(err.code).toUpperCase()}] ${message}` : message,
};
}
}