使用React和Express GraphQL的频繁请求

时间:2019-02-24 09:38:57

标签: node.js reactjs express asynchronous graphql

我正在使用带有MariaDB数据库的React和Express GraphQL创建一个网站。但是,我经常向GraphQL API提出请求/订阅时遇到了一个问题。

有问题的页面在React中加载后,我称其为:

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

其中queryWaiting是一个函数,它向fetch处的GraphQL服务器执行一个localhost:3000/graphql请求。该URL本身是我的setupProxy.js文件中定义的代理,它代理localhost:4000/graphql中的URL,因此不需要使用CORS。

值得注意的是,我也在clearIntervalwaitingTimer componentWillUnmount

在我只用node运行的GraphQL服务器文件中,我就这样设置了服务器:

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秒钟之间,我的React应用程序对此特定查询的POST请求停止得到解决,并且我必须重新加载页面以使其开始再次被接受。奇怪的是,其他请求也没问题。

我尝试了各种解决方案,例如切换到使用当前使用的代理方法,并且我还考虑了Express代码中内置反DDOS机制的可能性,但是我可以找不到任何证据。

非常感谢您对此问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

找出最佳解决方案是输入并解释您的代码:)

此代码:

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

内含一个诺言,所以确实应该做到:

resolve(cachedWaiting);

而不是返回它。

仅此而已。我目前在踢自己。