lentryd / NetSchoolApi

Асинхронный API-враппер для 'Сетевой Город. Образование' на Node.js.
https://lentryd.su/NetSchoolApi/
MIT License
23 stars 1 forks source link

Как обрабатывать ошибки? #10

Closed agran closed 1 year ago

agran commented 1 year ago

Подскажите пожалуйста как обрабатывать ошибки.

Например у меня есть цикл и я делаю подряд много запросов var result = await user.reportFile({ Иногда на каком-то запросе происходит задержка, и вдруг скрипт прекращается выдав "DONE Сеанс ЛОГИН успешно закрыт". Если запустить повторно, то может дойти до конца, а может снова вылететь в другом месте.

Как обработать неудачный запрос reportFile и сразу повторить с этого же места?

lentryd commented 1 year ago

try catch может помочь. А вообще все функции в библиотеке это промисы и у них ошибки ловятся с помощью .catch

В твоём случае можно сделать так.

const result = await user.reportFile({...}).catch(() => null);
if (result == null) console.log("Ошибка");
lentryd commented 1 year ago

Иногда на каком-то запросе происходит задержка

Можешь в ручную увеличить время параметра timeout (см. документацию)

lentryd commented 1 year ago

Как обработать неудачный запрос reportFile и сразу повторить с этого же места?

let result = null;

do {
  result = await user.reportFile({...}).catch(() => null);
} while (result == null);

только лучше еще добавить счетчик итераций, чтобы это не было бесконечно

agran commented 1 year ago

Не помогло, всё равно завершается с сообщением "DONE Сеанс ЛОГИН успешно закрыт".

agran commented 1 year ago

Вот пример моего кода, всё равно вылетает скрипт.

var result = null;
var col = 0;
do {
    console.log("reports/studenttotal/queue " + col);
    result = await user.reportFile({
        url: "reports/studenttotal/queue",
        filters: [{
                filterId: "PCLID",
                filterValue: klassid, // ID класса
            },
            {
                filterId: "SEPTYPE",
                filterValue: "0", // ID класса
            },
            {
                filterId: "period",
                filterValue: period,
            },
        ],
    }).catch(() => null);
    col++;
    if (col > 1) {
        await new Promise(resolve => setTimeout(resolve, 1000));
    }
} while (result == null && col < 25);
lentryd commented 1 year ago

Можешь ещё бахнуть try catch он 100% все отловить сможет, только тут уже нужно будет использовать рекурсию

agran commented 1 year ago
var result = null;
var col = 0;
do {
    console.log("reports/studenttotal/queue " + col);
    try {
        result = await user.reportFile({
            url: "reports/studenttotal/queue",
            filters: [{
                    filterId: "PCLID",
                    filterValue: klassid, // ID класса
                },
                {
                    filterId: "SEPTYPE",
                    filterValue: "0", // ID класса
                },
                {
                    filterId: "period",
                    filterValue: period,
                },
            ],
            timeout: 120000,
        }).catch(() => null);
    } catch (err) {
        console.log(JSON.stringify(err));
        result = null;
    }
    col++;
    if (col > 1) {
        await new Promise(resolve => setTimeout(resolve, 1000));
    }
} while (result == null && col < 25);

Посмотрю как этот код будет работать. Пока нормально.

lentryd commented 1 year ago

А скинь скриншот ошибки, которая приводила к завершению кода

agran commented 1 year ago

Пока не попадалась.

agran commented 11 months ago
const { inspect } = require('util');

var parents = null;
do {
  try {
      parents = await user
          .fetch("/webapi/userinfo/"+uchenikId+"/parents")
          .then((res) => res.json());

  } catch (err) {
      console.log(inspect(err, { showHidden: true }));
      await new Promise(resolve => setTimeout(resolve, 10000));
  } 
} while (parents !== null);

Таким кодом делаю повторные запросы, так как сервер иногда возвращает 503 ошибку.

agran commented 11 months ago

Проблема в том что следующий код:

    try {
        result = await user.reportFile({
            url: "reports/studenttotal/queue",
            filters: [
                    {
                filterId: "PCLID",
                filterValue: klassid, // ID класса
                    },
                    {
                filterId: "SEPTYPE",
                filterValue: "0",
                    },
                    {
                filterId: "period",
                filterValue: period,
                    },
            ],
            timeout: 5000
        });
    } catch (err) {
        console.log(inspect(err, { showHidden: true }));
        result = null;
    }

Не отлавливает ошибку, а скрипт просто без всяких сообщений прекращает работу с случае если сервер что-то не то ответил. А хотелось бы в случае ошибки сервера попробовать сделать повторных запрос.