Разбор SDK JavaScript с Node.js ENOTFOUND

Итак, я хочу получить большой объем данных в Parse, хорошим решением, которое я нашел, является создание рекурсивной функции: когда данные будут успешно найдены, запустите другой запрос. То, как я это делаю, довольно просто:

var containedLimit = 1000, // Also tried with 500, 300, and 100
    parseUsersWaiting = {
        // A lot of Users
    },
    parseUsers = {}, // Recipt for Users
    getPlayers = function (containedIn) {        
        var count = 0;

        if (containedIn == undefined) {
            containedIn = [];

            for (var i in parseUsersWaiting) {
                count++;
                if (count > containedLimit) {
                    break;
                }

                containedIn.push(parseUsersWaiting[i].id);
                delete parseUsersWaiting[i];
            }
        }

        var UserObject = Parse.Object.extend('User'),
            UserQuery = new Parse.Query(UserObject);

        UserQuery.limit(containedLimit);

        UserQuery.containedIn('objectId', containedIn);
        UserQuery.find({
            success: function (results) {
                if (results) {
                    for (var i in results) {
                        if (parseUsers[results[i].id] == undefined) {
                            parseUsers[results[i].id] = results[i];
                        }

                        // Other stuff

                        if (results.length < containedLimit) {
                            // End of process
                        } else {
                            getPlayers();
                        }
                    }
                } else {
                    // Looks like an end of process too
                }
            }, error: function (error) {
                console.log(error.message);
                getPlayers(containedIn);
            }
        });
    };

Теперь вот что я хотел бы назвать "проблемой": часто случается, что обратный вызов "error" запускается с этим:

Received an error with invalid JSON from Parse: Error: getaddrinfo ENOTFOUND api.parse.com
at errnoException (dns.js:44:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26)

(С кодом 107, конечно) Итак, я искал в Parse Documentation, и он говорит то же самое: "Получил ошибку с недопустимым JSON". Да.

Я использую Parse SDK, предоставленный Parse.com(npm install parse)

Я также попытался немного изменить код Parse с заменой ключа host на "имя хоста" в строке 361 файла parse/node_modules/xmlhttprequest/lib/XMLHttpRequest.js (версия пакета анализа: 1.5.0), и он не сработал, поэтому я удалил свои изменения.

(Кстати, я нашел решение, говорящее об использовании ulimit, чтобы изменить ограничение использования памяти, которое могло бы решить проблему, но на самом деле у меня нет необходимых прав для выполнения этой команды)

Ответ 1

Эта ошибка возникает, когда она не может подключиться к API (технически, когда она не может найти IP-адрес сервера API). Возможно, ваше интернет-соединение было потеряно на короткое время или их SDK-сервер был недоступен (или, возможно, сервер отклонил ваш запрос из-за ограничений по скорости).

В любом случае полезно кодировать некоторую устойчивость в вашем приложении. Я вижу, что ваша функция ошибок повторяет вызов API, но, возможно, стоит добавить тайм-аут, прежде чем вы это сделаете, чтобы дать проблеме возможность восстановить?

    error: function (error) {
        console.log(error.message);
        setTimeout(getPlayers, 10000, containedIn);
    }

Если значение sever ограничено вашими запросами, это также поможет.