我正在使用带有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。
值得注意的是,我也在clearInterval
中waitingTimer
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机制的可能性,但是我可以找不到任何证据。
非常感谢您对此问题的任何帮助。
答案 0 :(得分:0)
找出最佳解决方案是输入并解释您的代码:)
此代码:
if (cachedWaitingTime + cachedWaitingInterval > currentTime) {
return cachedWaiting;
}
内含一个诺言,所以确实应该做到:
resolve(cachedWaiting);
而不是返回它。
仅此而已。我目前在踢自己。