обработка ошибок
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user