72 votes

node.js stocker des objets dans redis

Voici le problème : je veux stocker des objets JS natifs (node.js) (références flash sockets) dans redis sous une certaine clé. Lorsque je fais cela avec de simples client.set() il est stocké sous forme de chaîne. Lorsque j'essaie de récupérer la valeur, j'obtiens [object Object] - juste une chaîne.

Y a-t-il une chance que cela fonctionne ? Voici mon code :

  addSocket : function(sid, socket) {
    client.set(sid, socket);
  },

  getSocket : function(sid) {
    client.get(sid, function(err, reply) {
      // cant't get an object here. All I get is useless string
    });
  },

0 votes

Vous ne pouvez pas stocker les références à javascript dans une forme de base de données parce que les objets disparaissent lorsque le serveur tombe en panne

2voto

Mr.Developer Points 1

Nous pouvons stocker un objet sous forme de chaîne en utilisant JSON.stringyfy(obj) ; et après nous pourrions récupérer l'objet original en utilisant JSON.parse(obj) ;

const obj = {
   userId: socket.user._id,
   socketId: socket.id,
};
await client.set("user", JSON.stringify(obj));
const usersData = await client.get("user");

-1voto

Nick Sotiros Points 93

Si vous y réfléchissez, les objets javascript sont des clés dont les valeurs peuvent faire référence à d'autres objets, et dans le cas des sockets, à des objets natifs. Donc si redis est externe à l'exécution du javascript, comment sera-t-il capable de stocker une référence à cet objet ?

// a and b exist inside the executing javascript, not in the external O/S
a = {}
b = {}

var obj = {
  'one': a,
  'two': b
}

// how can redis possibly store references to obj, a or b when this application exits?
redis.set('obj', obj)

// same as..
redis.set('obj', obj.toString()) /*or*/ redis.set('obj', "" + obj)

// same as..
redis.set('obj', "[object Object]")

// the trick is to stringify the object
redis.set('obj', JSON.stringify(obj))

// same as..
redis.set('obj', "{'one':{},'two':{}}")

// here redis does not have to store the actual object references but rather a json string representing the object

// this could also work
redis.set('obj', "{'one':a,'two':b}")

// where you would then do:
obj = eval(redis.get('obj')) 
// provided that a and b have already been initialized

-5voto

Shane Points 96

Vous pouvez enregistrer une référence à l'objet JavaScript, en utilisant une technique comme celle-ci. En gros, il étend Object.prototype (ce n'est pas obligatoire) et vous pouvez appeler radd() pour ajouter une référence personnalisée à rhash{}, puis récupérer l'objet avec rget(). La "référence" est une chaîne de caractères, ce qui permet de l'intégrer directement dans Redis. Cela signifie que vous n'aurez pas besoin de .stringify() et .parse() pour mettre/récupérer une copie dans la base de données. Cependant, les données de l'objet seront détruites lorsque Node s'éteindra, à moins qu'elles ne soient sérialisées.

var OBJECT = Object.prototype;
OBJECT.rhash = {};
OBJECT.rset = function(id, object) {
  OBJECT.rhash[id] = object;
  return id;
};
OBJECT.rget = function(id) {
  return OBJECT.rhash[id];
};

var dog = {
  name: "Skippy",
  food: "Bacon",
  bark: function() {
    alert(this.name + "!");
  }
};

var id = OBJECT.rset("a123", dog);
var ref = OBJECT.rget("a123");
ref.bark();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X