обработка ошибок

This commit is contained in:
gorbenko.pavel
2026-08-07 14:27:58 +05:00
parent 03391d7669
commit 6dcea0fe02
7 changed files with 173 additions and 12 deletions
@@ -0,0 +1,32 @@
// PnPjs (getById(...).update(...) и т.п.) при ошибке SharePoint кладёт в
// Error.message не только код HTTP, но и ВЕСЬ сырой текст ответа сервера —
// это JSON вида {"odata.error":{"code":"...","message":{"lang":"ru-RU","value":"..."}}}.
// Если просто вывести e.message пользователю, он увидит фигурные скобки,
// "odata.error" и escape-последовательности \uXXXX прямо как текст (это НЕ
// баг кодировки — JSON.parse их корректно раскрывает в кириллицу, но e.message
// это просто СТРОКА, а не распарсенный объект, вот они и остаются как есть).
interface ISharePointErrorEnvelope {
'odata.error'?: { message?: { value?: string } };
}
/** Читаемый текст ошибки — вытаскивает odata.error.message.value, если он есть. */
export function describeError(e: unknown): string {
const message = e instanceof Error ? e.message : String(e);
const jsonStart = message.indexOf('{');
if (jsonStart === -1) return message;
try {
const parsed = JSON.parse(message.slice(jsonStart)) as ISharePointErrorEnvelope;
return parsed['odata.error']?.message?.value || message;
} catch {
// Не JSON (или обрезан) — отдаём как есть, лучше сырой текст, чем ничего.
return message;
}
}
/** Полная ошибка — в консоль (для диагностики), пользователю возвращается только читаемый текст. */
export function reportError(e: unknown, context: string): string {
// eslint-disable-next-line no-console
console.error(`[ApprovalAdmin] ${context}`, e);
return describeError(e);
}