Проблема с использованием ioredis scanStream () для сканирования всех ключей Redis - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь синхронизировать все ключи Redis с MongoDB в приложении NodeJS.

Я использую ioredis в качестве клиента NodeJS Redis, и попытался достичь вышеуказанного с помощью функции scanStream () . Эта функция, предположительно, является более простым способом сканирования всех клавиш курсора с помощью потоков.

Это код, который я использую для сканирования всех ключей:

const stream = await redis.scanStream();
stream.on("data", async (resultKeys) => {
  await stream.pause();
  for (let i = 0; i < resultKeys.length; i++) {
    try {
      let KEY = resultKeys[i];
      let redisObjectStr = await redis.get(KEY);
      let redisObject = JSON.parse(redisObjectStr);

      // Sync Redis key with MongoDB
      const user = await User.findOne({
        apiKey: KEY
      }).exec();

      if (user) {
        user.color = redisObject.color;
        user.size = redisObject.size;
        await user.save();
        await stream.resume();
      }
    } catch (err) {
      next(err)
    }
  }
});
stream.on("end", () => {
  console.log("all keys have been visited")
  res.send("done")
})

Однако я получаю следующую ошибку:

api_1 | все ключи были посещены proxy_1 | 172.18.0.1 - - [22 / Jan / 2019: 12: 52: 06 +0000] "GET / api / syncredis HTTP / 1.1" 200 4 "-" "PostmanRuntime / 7.6.0" "-" api_1 | :: ffff: 172.18.0.6 - - [22 / Jan / 2019: 12: 52: 06 +0000] "GET / api / syncredis HTTP / 1.1" 200 4 "-" "PostmanRuntime / 7.6.0" api_1 | SyntaxError: неожиданный токен l в JSON в позиции 0 api_1 | в JSON.parse () api_1 | на ScanStream.stream.on (/usr/src/app/routes/testRoute.js:428:32) api_1 | в process.internalTickCallback (internal / process / next_tick.js: 77: 7) api_1 | Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после они отправляются клиенту

...