Код-ревью Middle Офлайн и хранение обновлено
Код-ревью: хранение сессии и кеша
Вопрос
Модуль хранения сессии и кеша каталога. Найдите проблемы.
import AsyncStorage from '@react-native-async-storage/async-storage';
export async function saveSession(token: string, refresh: string) {
await AsyncStorage.setItem('session', JSON.stringify({ token, refresh }));
}
export async function cacheCatalog(items: Product[]) {
await AsyncStorage.setItem('catalog', JSON.stringify(items));
}
export async function addToCatalog(item: Product) {
const items = JSON.parse(await AsyncStorage.getItem('catalog'));
items.push(item);
await cacheCatalog(items);
}
export function logout() {
AsyncStorage.removeItem('session');
}
Коротко
Секреты в защищённое хранилище, большие данные в базу, обработка пустых значений, атомарные изменения и полная очистка при выходе.
Что должен найти ревьюер
- Безопасностьстрока 4Токены в AsyncStorage хранятся без шифрования. Нужно защищённое хранилище (
expo-secure-store, Keychain/Keystore). - Производительностьстрока 8Весь каталог одним ключом: каждое изменение сериализует и пишет всё. Для больших данных нужна база (SQLite).
- Ошибкастрока 12
getItemвернётnullпри пустом кеше,JSON.parse(null)дастnull, иpushупадёт. - Ошибкастрока 12Чтение и запись без блокировки: два параллельных
addToCatalogпотеряют один из товаров. - Ошибкастрока 18
removeItemбезawaitи без обработки ошибки; при выходе не очищаются кеш каталога и другие данные пользователя, не отвязывается push-токен.
Разбор
Секреты в защищённое хранилище, большие данные в базу, обработка пустых значений, атомарные изменения и полная очистка при выходе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.