【发布时间】:2020-08-19 15:26:06
【问题描述】:
我正在尝试在 NodeJS 应用程序中将所有 Redis 密钥与 MongoDB 同步。
我使用 ioredis 作为 NodeJS Redis 客户端,并尝试通过使用scanStream() function 来实现上述目的。这个函数被认为是一种使用流扫描光标中所有键的更简单方法。
这是我用来尝试扫描所有键的代码:
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“-” "邮递员运行时/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“-” “邮递员运行时/7.6.0” api_1 | SyntaxError: Unexpected token l in 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]:之后无法设置标头 它们被发送给客户
【问题讨论】:
-
您在 redis 中的某些键的数据中似乎没有 JSON 格式。或者另一种情况 - 其中一些不是字符串键,redis.get 将失败。