Частые запросы с React и Express GraphQL - PullRequest
0 голосов
/ 24 февраля 2019

Я создаю сайт, используя React и Express GraphQL, с базой данных MariaDB.Однако я столкнулся с проблемой частых запросов / подписок на API GraphQL.

После загрузки соответствующей страницы в React я вызываю это:

componentDidMount() {
    this.setState({
        waitingTimer: setInterval(this.queryWaiting.bind(this), 1000)
    });
}

где queryWaiting - это функция, которая выполняет запрос fetch на мой сервер GraphQL по номеру localhost:3000/graphql.Этот URL-адрес является прокси-сервером, определенным в моем файле setupProxy.js, который передает URL-адрес с localhost:4000/graphql, поэтому мне не нужно использовать CORS.

Стоит отметить, что я также clearInterval this waitingTimer in componentWillUnmount.

В моем файле сервера GraphQL, который я просто запускаю с node, я настроил свой сервер так:

var app = express();

app.use("/graphql", graphqlHTTP({
    schema: schema,
    rootValue: root,
    graphiql: true,
}));
app.listen(4000);

Где schema является допустимой схемой, а root является моим корневым распознавателем.

Запрос API, который я повторяю, вызываю, называется getWaitingCount и действует так:

getWaitingCount: () => {
    return new Promise((resolve, reject) => {
        var currentTime = Date.now() / 1000;

        if (cachedWaitingTime + cachedWaitingInterval > currentTime) {
            return cachedWaiting;
        }

        connection.query("SELECT COUNT(*) FROM profiles WHERE isWaiting=1;", function (error, results, fields) {
            if (error)
                reject(error);
            else {
                // Update cache values
                cachedWaiting = results[0]["COUNT(*)"];
                cachedWaitingTime = Date.now() / 1000;
                resolve(cachedWaiting);
            }
        });
    });
}

Я реализовал некоторое кэширование, чтобы уменьшить нагрузку на сервер.Переменные кэширования определены в другом месте.

Проблема, с которой я сталкиваюсь, заключается в том, что через 2-10 секунд запросы POST для этого конкретного запроса из моего приложения React перестают обрабатываться, и мне приходится перезагружать страницу дляих начать получать снова.Как ни странно, другие запросы проходят нормально.

Я пробовал различные решения, такие как переключение на использование метода прокси, который я использую в настоящее время, и я также рассмотрел возможность встроенногоМеханизм DDOS в коде Express, но я не могу найти никаких доказательств этого.

Любая помощь в этом вопросе очень ценится.

1 Ответ

0 голосов
/ 24 февраля 2019

Оказывается, лучшее решение - набрать и объяснить свой код:)

Этот код:

if (cachedWaitingTime + cachedWaitingInterval > currentTime) {
    return cachedWaiting;
}

внутри обещания, так что на самом деле он должен выполнить:

resolve(cachedWaiting);

вместо того, чтобы вернуть его.

Вот и все.В настоящее время я бью себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...