Проблема запуска фонового процесса в node.js - PullRequest
0 голосов
/ 18 января 2019

У меня есть установка node.js / express с кодом ниже. Код на стороне клиента построен с помощью React. Они могут запросить X количество игроков, используя выборку от 1 до того, что они хотят. Запрос отправляется на мой экспресс-сервер, который отправляет запросы в общедоступные API Riot Games. У меня проблема в том, что если запрос слишком велик, время выборки истекло.

Кто-то дал мне идею, чтобы первоначальный запрос POST возвратил «id», а затем выполнил фактический запрос в фоновом режиме. Затем пусть клиентский браузер периодически проверяет, завершен ли запрос GET-запросом.

Я вызываю исходный POST внутри React componentDidMount () , а затем отправляю запрос GET внутри componentDidUpdate () . Я думаю, с чем я сталкиваюсь, когда отправляю запрос get, а также с тем, как я запускаю фоновый процесс. Я помещаю результат запроса в массив allResults [0]. playerRequest является асинхронной функцией.

Надеюсь, я объяснил это достаточно хорошо ... не совсем уверен, что делать.

ЦСИ / сервер / 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});
});

1 Ответ

0 голосов
/ 18 января 2019

Ожидание обещания в конечной точке асинхронного результата, а также тайм-аут, если результат еще не получен:

var playerSearch = require('./playerSearch.js');
const express = require('express');
const bodyParser = require('body-parser');
const uuidv1 = require('uuid/v1');

const {promisify} = require('util');

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 = {};

const timeout = promisify(setTimeout);

//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[searchID] = playerSearch(req, searchID);
  console.log('Search ID: ' + searchID);
  return res.send({searchID: searchID});
});

app.get('/api/champstats/playerSearch/:searchId', async function(req, res){
  const searchResult = allResults[req.params.searchID];
  const result = await Promise.race([ // return the first result you get
    timeout(100).then(async ()=>null), // wait for 100ms then return null.
    searchResult # if the search result returns before 100ms, use that as the result
    ]);
  if (result != null){
    return res.send({stats: result[0].stats});
  } else {
    // return an error message so you can try again later
  }
});

Есть несколько вариантов того, как вы можете сделать этот шаблон с асинхронным ожиданием вместо использования .then, если вы хотите поэкспериментировать с ними. Однако следует отметить, что любой обратный вызов для тайм-аута, вероятно, не должен отвечать на запрос, потому что он не будет отменен, если другое обещание вернется первым. Все обещания, переданные .race, в конечном итоге завершатся, поэтому, если вы вызываете методы для res, имейте это в виду. .race не отменяет ожидающие обещания.

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