Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/11
This commit was merged in pull request #11.
This commit is contained in:
@@ -52,6 +52,42 @@ export function describeReason(reason: unknown): string {
|
||||
}
|
||||
}
|
||||
|
||||
// PnPjs/SharePoint кладёт в Error.message текст ответа сервера целиком —
|
||||
// например: `Error making HttpClient request in queryable [404] ::>
|
||||
// {"odata.error":{"message":{"value":"Элемент не существует..."}}}`. Пока это
|
||||
// строка, а не распарсенный JSON, русские буквы в ней остаются как литеральные
|
||||
// escape-последовательности `Эл...`, и в UI вместо кириллицы видно
|
||||
// набор из "\u". Достаём odata.error.message.value через JSON.parse — сам
|
||||
// парсер раскодирует escape-последовательности обратно в текст.
|
||||
// SharePoint отдаёт этот же текст и когда элемент правда удалён, и когда у
|
||||
// пользователя просто нет прав на список/элемент (сервер прячет 403 за 404,
|
||||
// чтобы не подтверждать существование элемента посторонним). По одному
|
||||
// тексту эти два случая не различить, а "нет доступа" на практике встречается
|
||||
// куда чаще, чем совпадение по времени с удалением — поэтому подменяем
|
||||
// формулировку на более вероятную причину.
|
||||
const ITEM_NOT_FOUND = 'Элемент не существует. Возможно, он был удален другим пользователем.';
|
||||
const NO_ACCESS_HINT =
|
||||
'Элемент не найден. Скорее всего, у вас нет доступа к этому списку или элементу (либо он был удалён).';
|
||||
|
||||
export function friendlyErrorMessage(e: unknown): string {
|
||||
const message = e instanceof Error ? e.message : String(e);
|
||||
const start = message.indexOf('{');
|
||||
const end = message.lastIndexOf('}');
|
||||
if (start !== -1 && end > start) {
|
||||
try {
|
||||
const parsed = JSON.parse(message.slice(start, end + 1)) as {
|
||||
'odata.error'?: { message?: { value?: string } };
|
||||
};
|
||||
const value = parsed['odata.error']?.message?.value;
|
||||
if (value === ITEM_NOT_FOUND) return NO_ACCESS_HINT;
|
||||
if (value) return value;
|
||||
} catch {
|
||||
// Тело не JSON (или не то, что ожидали) — отдаём исходное сообщение.
|
||||
}
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
function logError(kind: string, reason: unknown): void {
|
||||
console.error(`${PREFIX} ${kind}: ${describeReason(reason)}`);
|
||||
// Стек и объект — отдельными аргументами: так консоль браузера даёт
|
||||
|
||||
Reference in New Issue
Block a user