我正在使用ioredis
库在redis管道中执行一系列命令。
以下是我尝试做的事情的一个简化示例:
// Assume ioredis var is a successfully-connected ioredis client
const pipeline = ioredis.pipeline();
pipeline.hset('mykey', { foo: 'bar' })
.then(() => {
pipeline.expire('mykey', 1000, (err) => {
if (err) {
console.error('Error: ', JSON.stringify(err));
} else console.info('Success!');
});
});
pipeline.exec();
您会注意到这个例子同时有一个promise链和第二个promise的一些错误处理。当我直接对ioredis客户端(没有管道(执行此逻辑时,它运行得很好,但当我使用管道时,会抛出一个空对象的错误。
关于ioredis的文档不是很有帮助,所以任何能为我指明正确方向的信息都将不胜感激!
如果检查文档,当您有多个命令并希望它们按给定顺序执行时,将使用管道。您可以在一次拍摄中获得结果,也可以使用cb样式来获得结果。当您同时使用这两种方法时,您也可以直接在管道链上使用exec
。
// Assume ioredis var is a successfully-connected ioredis client
const pipeline = ioredis.pipeline();
pipeline
.hset('mykey', { foo: 'bar' })
.then((err, results) => {
if (err) {
console.error('Error: ', JSON.stringify(err));
} else console.info('Success!');
})
.expire('mykey', 1000)
.then((err, results) => {
// do things here
})
.exec((err, results) => {
// `err` will null always
// result === [[null, 'OK'], [null, 'bar']...]
// result ==== [[err,result],...] from every command you run
});
我建议您重新检查这里的文档(检查管道部分(。它并不冗长,但一旦你仔细阅读并查看了示例,它就会起作用。