refetchUtil не работает так, как надо #1

Closed
opened 2022-11-18 18:49:44 +01:00 by VityaSchel · 3 comments
VityaSchel commented 2022-11-18 18:49:44 +01:00 (Migrated from github.com)

По идее эта утилита должна сделать запрос, перелогиниться и сделать запрос заново. Но из-за того, что во время перелогина меняются токен, csrf и тд, данные внутри body запроса становятся не валидными. Нужно как то заставлять метод выше заново собрать тело запроса и повторить запрос.

По идее эта утилита должна сделать запрос, перелогиниться и сделать запрос заново. Но из-за того, что во время перелогина меняются токен, csrf и тд, данные внутри body запроса становятся не валидными. Нужно как то заставлять метод выше заново собрать тело запроса и повторить запрос.
VityaSchel commented 2022-11-18 18:50:21 +01:00 (Migrated from github.com)

Возможный путь решения №1:

Автоматически детектировать все поменявшиеся токены внутри старого запроса и в контексте refetchUtil подменять на новые

# Возможный путь решения №1: Автоматически детектировать все поменявшиеся токены внутри старого запроса и в контексте refetchUtil подменять на новые
VityaSchel commented 2022-11-18 18:55:10 +01:00 (Migrated from github.com)

Возможный путь решения №2:

Также можно выкинуть ошибку типа RELOGGED_IN_RETRY, которая означает, что методу наверху нужно просто повторить вызов этого же запроса. Например так:

Было:

await SOTK.addCard('100100100')

Стало:

try {
  await SOTK.addCard('100100100')
} catch(e) {
  if(e instanceof SOTKOperationReloggedRetry) { // или e.code === 'RELOGGED_IN_RETRY'
    await SOTK.addCard('100100100')
  }
}

Вопрос в том, как сделать это красиво без дублирования параметров и в идеале без дублирования имен методов, а также как это все привязать к крупным блокам кода, выполняющим одну функцию, например

    await SOTK.addCard(cardID)
    cardInfo = await SOTK.getCardInfo(cardID)
    await SOTK.deleteCard(cardID)
# Возможный путь решения №2: Также можно выкинуть ошибку типа RELOGGED_IN_RETRY, которая означает, что методу наверху нужно просто повторить вызов этого же запроса. Например так: Было: ```ts await SOTK.addCard('100100100') ``` Стало: ```ts try { await SOTK.addCard('100100100') } catch(e) { if(e instanceof SOTKOperationReloggedRetry) { // или e.code === 'RELOGGED_IN_RETRY' await SOTK.addCard('100100100') } } ``` Вопрос в том, как сделать это красиво без дублирования параметров и в идеале без дублирования имен методов, а также как это все привязать к крупным блокам кода, выполняющим одну функцию, например ```ts await SOTK.addCard(cardID) cardInfo = await SOTK.getCardInfo(cardID) await SOTK.deleteCard(cardID) ```
VityaSchel commented 2022-11-18 18:56:27 +01:00 (Migrated from github.com)

Возможный путь решения №2:

Также можно выкинуть ошибку типа RELOGGED_IN_RETRY, которая означает, что методу наверху нужно просто повторить вызов этого же запроса. Например так:

Было:

await SOTK.addCard('100100100')

Стало:

try {
  await SOTK.addCard('100100100')
} catch(e) {
  if(e instanceof SOTKOperationReloggedRetry) { // или e.code === 'RELOGGED_IN_RETRY'
    await SOTK.addCard('100100100')
  }
}

Вопрос в том, как сделать это красиво без дублирования параметров и в идеале без дублирования имен методов, а также как это все привязать к крупным блокам кода, выполняющим одну функцию, например

    await SOTK.addCard(cardID)
    cardInfo = await SOTK.getCardInfo(cardID)
    await SOTK.deleteCard(cardID)

Возможно имеет смысл перенести генерацию тела с зависимыми от сессии данными внутрь runJSONOperation() и там уже в повторном вызове метод сам добавит все необходимое из свойства this.credentials

> # Возможный путь решения №2: > Также можно выкинуть ошибку типа RELOGGED_IN_RETRY, которая означает, что методу наверху нужно просто повторить вызов этого же запроса. Например так: > > Было: > > ```ts > await SOTK.addCard('100100100') > ``` > > Стало: > > ```ts > try { > await SOTK.addCard('100100100') > } catch(e) { > if(e instanceof SOTKOperationReloggedRetry) { // или e.code === 'RELOGGED_IN_RETRY' > await SOTK.addCard('100100100') > } > } > ``` > > Вопрос в том, как сделать это красиво без дублирования параметров и в идеале без дублирования имен методов, а также как это все привязать к крупным блокам кода, выполняющим одну функцию, например > > ```ts > await SOTK.addCard(cardID) > cardInfo = await SOTK.getCardInfo(cardID) > await SOTK.deleteCard(cardID) > ``` Возможно имеет смысл перенести генерацию тела с зависимыми от сессии данными внутрь runJSONOperation() и там уже в повторном вызове метод сам добавит все необходимое из свойства `this.credentials`
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
hloth/s-otk-bot#1
No description provided.