Ten doprowadza mnie do szału. Dezaktywuję użytkownika, zmieniając jego magazyn sesji w Redis. Najpierw znajduję klucz, zmieniam wartość i ustawiam nową wartość. Wszystkie odpowiedzi wskazują, że polecenia są wykonywane pomyślnie, ale redis-cli nie pokazuje żadnych zmian w tym kluczu.
// Update the Redis session
var client = redis.createClient();
var keys = await new Promise(function(resolve, reject) {
client.keys('*', function(err, reply) {
if(err) reject(err);
resolve(reply);
});
});
var data = await new Promise(function(resolve, reject) {
keys.forEach(function(key) {
resolve(new Promise(function(resolve, reject) {
client.get(key, function(err, reply) {
if(err) reject(err);
var session = JSON.parse(reply);
if(session.userId == userId) {
session.authenticated = false;
return resolve({key: key, value: JSON.stringify(session)});
}
});
}));
});
});
var reply = await new Promise(function(resolve, reject) {
client.set(data.key, data.value, function(err, reply) {
if (err) reject(err);
resolve(reply);
});
});
console.log(keys);
console.log(data);
console.log(reply);
Mimo że ustawiłem właściwość authentication na false dla tego klucza, nadal jest wyświetlana jako true z redis-cli. Dziennik z konsoli i odpowiedź pokazują, że polecenie się powiodło, ale tak nie jest. Jakieś pomysły?
Oto, co otrzymałem z redis-cli
127.0.0.1:6379> get sess:_xArN7ShiZRjyxbv_5xuh0FhTU6orlX5
"{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"loginFailed\":false,\"authenticated\":true,\"userId\":1"}"
1 odpowiedź
Ok, więc testowałem to na sobie, co nie działa, ponieważ wartość, którą ustawiłem, została nadpisana przez oprogramowanie pośredniczące sesji.
Również obietnice były wykonywane równolegle, a nie sekwencyjnie, więc zagnieżdżanie wywołań zwrotnych miało w tym przypadku większy sens i rozwiązało tę część problemu.
Mając nadzieję, że to pomoże komuś innemu.
redis-cli
.