gpt4 book ai didi

node.js - Redis - 在具有 promise 的事务中插入数组中的值( Bluebird )

转载 作者:IT王子 更新时间:2023-10-29 06:01:57 26 4
gpt4 key购买 nike

我有一个这样的数组:

var names = ['Irina', 'Michael', 'Carl'];

我想使用 promise 交易将它们插入 redis(我不知道其他方式)。但是我对如何做到这一点感到困惑;这是我的代码:

var Promise = require("bluebird");
var redis = require("redis");

Promise.promisifyAll(redis.RedisClient.prototype);
Promise.promisifyAll(redis.Multi.prototype);

var client = redis.createClient(), multi;

var names = ['Irina', 'Michael', 'Carl'];

var result = names.map(function(item) {
client.watch('user:id');
client.getAsync('user:id', function(err, data) {
var multi = client.multi();
var user_id = parseInt(data) + 1;
multi.hmsetAsync('user:' + user_id, 'username', item, 'about', 'love to coding');
multi.incrAsync('user:id');
multi.execAsync(function(err,data){
console.log(data);
});
});
});

Promise.all(result).then(function(response) {
console.log(response);
});

但这行不通(:

编辑:这是应用程序抛出的错误:

未处理的拒绝错误:ERR 'get' 命令的参数数量错误

谁能帮帮我!


编辑 2: 我更改了我的代码,但现在只保存数组的最后一个值:

client.watch('user:id');
var result = names.map(function(item) {
var multi = client.multi();
client.getAsync('user:id').then(function(value) {
var user_id = parseInt(value) + 1;
return user_id;
}).then(function(user_id) {
multi.hmsetAsync('user:' + user_id, 'username', item, 'about', 'love to coding');
multi.incrAsync('user:id');
}).then(function() {
multi.execAsync().spread(function(err,data){
console.log(data);
});
});
});

编辑 3:

当使用 redis 的 MONITOR 时,这是输出:

[0 127.0.0.1:54439] "info"
[0 127.0.0.1:54439] "watch" "user:id"
[0 127.0.0.1:54439] "get" "user:id"
[0 127.0.0.1:54439] "get" "user:id"
[0 127.0.0.1:54439] "get" "user:id"
[0 127.0.0.1:54439] "MULTI"
[0 127.0.0.1:54439] "hmset" "user:88" "username" "Irina" "about" "love to coding"
[0 127.0.0.1:54439] "incr" "user:id"
[0 127.0.0.1:54439] "EXEC"
[0 127.0.0.1:54439] "MULTI"
[0 127.0.0.1:54439] "hmset" "user:88" "username" "Michael" "about" "love to coding"
[0 127.0.0.1:54439] "incr" "user:id"
[0 127.0.0.1:54439] "EXEC"
[0 127.0.0.1:54439] "MULTI"
[0 127.0.0.1:54439] "hmset" "user:88" "username" "Carl" "about" "love to coding"
[0 127.0.0.1:54439] "incr" "user:id"
[0 127.0.0.1:54439] "EXEC"

执行 get user:id 3 次,然后执行其他方法。为什么?

最佳答案

我用这种方式解决了我的问题:

client.watch('user:id');
Promise.each(names, function(item) {
var multi = client.multi();
return client.getAsync('user:id').then(function(value) {
var user_id = parseInt(value) + 1;
return user_id;
}).then(function(user_id) {
multi.hmsetAsync('user:' + user_id, 'username', item, 'about', 'love to coding');
multi.incrAsync('user:id');
}).then(function() {
return multi.execAsync().spread(function(err,data){
console.log(data);
});
});
})
.then(function() {
console.log("Ended process ...");
});

诀窍是改变:

var result = names.map(function(item) {...});

promise :

Promise.each(names, function(item) {...});

然后将 client.getAsync(user:id) 返回给它。

这是 redis 的 MONITOR 的输出:

[0 127.0.0.1:53290] "info"
[0 127.0.0.1:53290] "watch" "user:id"
[0 127.0.0.1:53290] "get" "user:id"
[0 127.0.0.1:53290] "MULTI"
[0 127.0.0.1:53290] "hmset" "user:88" "username" "Irina" "about" "love to coding"
[0 127.0.0.1:53290] "incr" "user:id"
[0 127.0.0.1:53290] "EXEC"
[0 127.0.0.1:53290] "get" "user:id"
[0 127.0.0.1:53290] "MULTI"
[0 127.0.0.1:53290] "hmset" "user:89" "username" "Michael" "about" "love to coding"
[0 127.0.0.1:53290] "incr" "user:id"
[0 127.0.0.1:53290] "EXEC"
[0 127.0.0.1:53290] "get" "user:id"
[0 127.0.0.1:53290] "MULTI"
[0 127.0.0.1:53290] "hmset" "user:90" "username" "Carl" "about" "love to coding"
[0 127.0.0.1:53290] "incr" "user:id"
[0 127.0.0.1:53290] "EXEC"

惊人的,但真实的! (线索:https://stackoverflow.com/a/25129878/2954267)

关于node.js - Redis - 在具有 promise 的事务中插入数组中的值( Bluebird ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com