【发布时间】:2019-06-12 03:37:14
【问题描述】:
我有一个带有以下代码的 node.js/express 设置。客户端代码是用 React 构建的。他们能够使用从 1 到任何他们想要的任何东西来查询 X 数量的玩家。查询被发送到我的快速服务器,该服务器向 Riot Games 公共 API 发送请求。我遇到的问题是,如果查询太大,则获取超时。
有人给了我一个想法,让初始 POST 请求返回一个“id”,然后在后台运行实际查询。然后让客户端的浏览器定期检查查询是否通过 GET 请求完成。
我在 React componentDidMount() 中调用初始 POST,然后在 componentDidUpdate() 中发送 GET 请求。我认为我在发送获取请求时搞砸的地方以及我如何启动后台进程。我将查询结果推送到 allResults[0] 数组。 playerRequest 是一个异步函数。
希望我解释得足够好......不太确定该怎么做。
src/server/index.js
var playerSearch = require('./playerSearch.js');
const express = require('express');
const bodyParser = require('body-parser');
const uuidv1 = require('uuid/v1');
const app = express();
app.use(express.static('dist'));
app.use(bodyParser.json());
app.use(express.json());
const port = process.env.PORT || 8080;
app.listen(port, () => console.log('Listening on port ' + port + '!'));
var allResults = [];
//Beginning of all methods
app.get('/api/getUsername', (req, res) => res.send({ username: 'Summoner' }));
app.post('/api/champstats/initiatePlayerSearch', async function(req, res){
var searchID = uuidv1();
allResults.push(await playerSearch(req, searchID));
console.log('Search ID: ' + searchID);
return res.send({searchID: searchID});
});
app.get('/api/champstats/playerSearch/:searchId', async function(req, res){
const result = await allResults.filter(x => x.requestID === req.params.searchID);
return res.send({stats: result[0].stats});
});
【问题讨论】:
-
删除
await到playerSearch是否修复它? (好吧,帖子部分,至少...... get 需要更改......) -
另外,将
allResults设为对象或地图,而不是推送,将来自 'playerSearch' 的承诺放在 searchID 键下,这样您就可以在 get... -
感谢您的回复。不幸的是,删除 await 不起作用。我的浏览器仍然超时并出现以下错误:“net::ERR_EMPTY_RESPONSE,错误:TypeError:无法获取”。我也确实将 allResults 放入了一个对象中。我一开始就应该这样做。
-
失败来自
/api/champstats/initiatePlayerSearch请求? (/api/champstats/playerSearch/:searchId仍然可以按照当前的编写方式超时) -
当前失败来自
/api/champstats/playerSearch/:searchId(GET) 请求。我想也许我需要定期调用这个请求,直到它成功(或失败),但我不知道该怎么做。现在我在/api/champstats/initiatePlayerSearch返回searchID 后立即调用它。 searchID 更新我的 React 组件状态,它调用 componentDidUpdate。 componentDidUpdate 里面是我的 GET 请求,它只被调用一次。此请求超时,因为 playerSearch(req) 仍在处理数据。
标签: javascript node.js reactjs express asynchronous