Я пытаюсь синхронизировать все ключи 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]: невозможно установить заголовки после
они отправляются клиенту