Redis клиент не будет устанавливать значения при получении сообщения - PullRequest
0 голосов
/ 29 сентября 2018

Начальный набор значений происходит на сервере (\ complex \ server \ index.js):

app.post('/values', async (req, res) => {
  const index = req.body.index;

  if (parseInt(index) > 40) {
    return res.status(422).send('Index too high');
  }

  redisClient.hset('values', index, 'Nothing yet!');
  redisPublisher.publish('insert', index);

  pgClient.query('INSERT INTO values(number) VALUES($1)', [index]);
  res.send({ working: true });
});

При отправке значения в компоненте (\ complex \ client \ src \ Fib.js):

handleSubmit = async (event) => {
    event.preventDefault();

    await axios.post('/api/values', {
      index: this.state.index
    });

    this.setState({ index: '' });
  };

работник устанавливает значение для клиента Redis:

sub.on('message', (channel, message) => {
  redisClient.hset('values', message, fib(parseInt(message)));
});
sub.subscribe('insert');

Однако, когда список всех значений в компоненте Fib.js для каждого представленного индекса, компонент получает «Ничего»пока! '.

Почему бы ему не получить рассчитанные значения?Полное репо на https://github.com/ElAnonimo/docker-complex

1 Ответ

0 голосов
/ 30 сентября 2018

redisClient.hset('values', index, 'Nothing yet!'); является асинхронным - ему нужно подключиться к Redis, отправить сообщение, дождаться ответа и т. Д.
Так что, вероятно, происходит гонка, redisPublisher.publish('insert', index); выполняется до того, как hset будетзавершает.

Я не прошел через код, поэтому вы также хотели бы избежать подобного состояния гонки с вызовом subscribe() после publish().

Попробуйте это:

app.post('/values', async (req, res) => {
  const index = req.body.index;

  if (parseInt(index) > 40) {
    return res.status(422).send('Index too high');
  }

  redisClient.hset('values', index, 'Nothing yet!', () => redisPublisher.publish('insert', index));

  pgClient.query('INSERT INTO values(number) VALUES($1)', [index]);
  res.send({ working: true });
});
...