Node-redis: Serialisierung von Nullwerten in einem Hash

Erstellt am 13. Juni 2013  ·  19Kommentare  ·  Quelle: NodeRedis/node-redis

Wenn der Wert von key, der über hset festgelegt wird, null ist, wird er als String "null" serialisiert. Wenn der Hash über hgetall abgerufen wird, ist der entsprechende Wert im zurückgegebenen Objekt der String "null" und nicht null.

Feature Request v4

Hilfreichster Kommentar

Ich habe festgestellt, dass node-redis keine Datentypkonvertierung für Stringwerte durchführt, die von redis abgerufen werden. Ich hatte implizit angenommen, dass Boolesche Werte, Zahlen usw. automatisch in den entsprechenden Javascript-Typ umgewandelt werden. Wenn Sie dies für nicht im Rahmen des Projekts halten, schließen Sie bitte das Thema.

Aber die automatische Konvertierung ist trotzdem schön zu haben. Ich habe gerade viel Zeit damit verbracht, einen Fehler zu beheben, der dadurch entstand, dass ein falscher Wert als "falsch" abgerufen wurde und die Wahrheitsprüfungsbedingungen von Javascript durchlaufen.

Alle 19 Kommentare

Ich habe festgestellt, dass node-redis keine Datentypkonvertierung für Stringwerte durchführt, die von redis abgerufen werden. Ich hatte implizit angenommen, dass Boolesche Werte, Zahlen usw. automatisch in den entsprechenden Javascript-Typ umgewandelt werden. Wenn Sie dies für nicht im Rahmen des Projekts halten, schließen Sie bitte das Thema.

Aber die automatische Konvertierung ist trotzdem schön zu haben. Ich habe gerade viel Zeit damit verbracht, einen Fehler zu beheben, der dadurch entstand, dass ein falscher Wert als "falsch" abgerufen wurde und die Wahrheitsprüfungsbedingungen von Javascript durchlaufen.

Richtig, das Wahre/Falsche ist das, was mich auch erwischt.

Ich würde dies gerne in der Bibliothek ansprechen, obwohl es definitiv Leistungsbedenken gibt.

@brycebaril könnten wir

Vielleicht gibt es eine Option im createClient-Konstruktor. Etwas wie...
_parse_bool_: wandelt "true" in true, "false" in false um
_parse_null_: wandelt "null" in null um

Aber wie würden Sie dann mit dem tatsächlichen Zeichenfolgenwert von "true" und "null" umgehen? Es gibt keine Möglichkeit, den ursprünglichen Eingabetyp zu ermitteln.

@Azmisov wie @dirkbonhomme darauf hingewiesen hat, dass dies keine gute Lösung wäre. Daher kann nur die Verwendung von JSON.stringify/parse eine Option sein.

Ich möchte dies nicht auf einer bestimmten Befehlsbasis, sondern für alle Befehle lösen. Auf diese Weise gibt es auch keine Leistungseinbußen, da wir sowieso jedes Argument überprüfen und noch wichtiger: Es wird für jeden Befehl gelöst, egal wie Sie die Argumente übergeben (Array, Objekt, Argumente).

Ich ziehe es vor, einen Fehler zurückzugeben, wenn ein Befehl einen undefinierten oder Nullwert enthält. Dies ist fast immer ein Zeichen dafür, dass mit den übergebenen Argumenten etwas nicht stimmt.
Einige Leute möchten jedoch möglicherweise eine Möglichkeit haben, mit undefinierten und/oder null-Werten anders umzugehen, daher würde ich eine Option hinzufügen, an die Sie eine Funktion übergeben können, und diese Funktion wird ausgelöst, wenn ein Befehl einen null / undefinierten Wert enthält.
Diese Funktion erhält immer den Befehlsnamen und die an sie übergebenen Argumente und der Rückgabewert ersetzt die ursprünglichen Argumente. Auf diese Weise kann jeder Benutzer diese Werte nach Belieben handhaben.
Die gleiche Logik könnte für wahr / falsch angewendet werden.

@NodeRedis/contributors @dirkbonhomme was denkst du? :)

@BridgeAR Ich würde nicht zustimmen, dass null "ein Zeichen dafür ist, dass etwas nicht stimmt". Nehmen Sie so etwas:

var myIndexes = ['one','two','three'], myMulti = client.multi();

myIndexes.forEach(function(aKey) { 
  myMulti.hget(aKey,'username'); 
  myMulti.hget(aKey,'address1');  
  myMulti.hget(aKey,'address2');
});

myMulti.exec(cb);

Sagen wir, wenn 'Adresse2' in Ihren Daten optional ist, dann ist die Rückgabe von null in Ordnung.

Davon abgesehen denke ich, dass es für viele Leute eine bahnbrechende Änderung wäre, daher sollte etwas wie Sie vorschlagen optional und nicht standardmäßig sein.

@stockholmux Ich bin mir nicht sicher, ob wir über dasselbe sprechen. Der Rückgabewert wird auf keinen Fall geändert.

Was ich ändern möchte ist, dass die Verwendung von null 'null' stattdessen zu der Zeichenfolge

client.set('foo', null);
client.get('foo', function (err, res) {
    console.log(res); // 'null'
});

Ich werde auch nichts kaputt machen, da ich vorhabe, das alte Verhalten abzulehnen (einige Leute könnten sich auf das fehlerhafte Verhalten verlassen, indem sie das Problem umgehen) und die Option hinzufügen, dies jetzt selbst zu handhaben und einen Fehler zurückzugeben von v.3.0.0 für solche Werte.

Wird das Problem mit dem Nullwert gelöst oder nicht?

Würden Sie in Ihrem Programm ein spezielles Token definieren, das den echten Nullwert darstellt. Wenn der Benutzer etwas auf null setzt, erfassen Sie diesen Befehl und ersetzen den Nullwert durch Ihr spezielles Token. Wenn der Benutzer dieses Ding erhält, erfassen Sie diesen Befehl und ersetzen das spezielle Token durch den echten Nullwert für den Benutzer?

Nur ein Vorschlag. dieses Problem ist wirklich störend. Da jeder Benutzer auf allen Sites einen Namen namens 'null' haben kann, möchten Sie den Benutzernamen nicht auf den echten Nullwert parsen;

Wurden Fortschritte oder Entscheidungen bezüglich des Flags "JSON.{parse,stringify} on input" getroffen? Es wäre schön, dies automatisch statt in einer bestimmten Get/Set-Logik zu tun.

Hey @taylorzane Ich habe momentan wenig Zeit aber es ist definitiv geplant das umzusetzen.

Das ist gut zu hören. Wenn ich etwas Zeit habe, kann ich es ausprobieren, es wäre definitiv schön, und ich genieße es, an der Quelle der von mir verwendeten Module zu hacken. :+1:

Funktioniert das jetzt?

Am Ende habe ich eine andere Methode zum Serialisieren von Daten in Redis verwendet, daher bin ich nie dazu gekommen, dies zu implementieren.

Wenn es Ihnen nichts ausmacht, @taylorzane zu teilen, wie speichern Sie JSON-Objekte mit Feldern, die möglicherweise Nullwerte enthalten, indem Sie Redis verwenden?

@slidenerd Ich

Beispiel:

const a = {
  a: {
    b: {
      c: null,
      d: true,
      e: "hello"
    }
  }
}

const b = flatten(a)
console.log(b) /* =>
{
  '/a/b/c': null,
  '/a/b/d': true,
  '/a/b/e': 'hello'
}
*/

Object.entries(b).forEach(([key, value]) => {
  redis.set(key, JSON.stringify(value)) // or
  redis.hset('my_hash', key, JSON.stringify(value)) /*
  => "/a/b/c" -> "null"
  => "/a/b/d" -> "true"
  => "/a/b/e" -> "\"hello\""
  */
})

Zögern Sie nicht, mich über Gitter oder die E-Mail in meinem Profil zu kontaktieren, wenn Sie weitere Informationen wünschen.

@slidenerd Die andere Option besteht darin, ReJSON zu verwenden, um Ihre JSON-Objekte zu speichern.

            items.push(JSON.stringify(object, (key, value) => {
                if (value === null || value === undefined) {
                    return undefined
                }
                else {
                    return isNaN(parseFloat(value)) ? value : parseFloat(value)
                }
            }))

Danke @stockholmux Ich habe eine bessere Lösung gefunden, ohne eine externe Abhängigkeit zu verwenden. Die Idee ist, die Ersetzungsfunktion in der Methode JSON.stringify zu verwenden, die zufällig das zweite Argument ist

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

yuany picture yuany  ·  4Kommentare

michaelwittig picture michaelwittig  ·  3Kommentare

Atala picture Atala  ·  3Kommentare

strumwolf picture strumwolf  ·  4Kommentare

id0Sch picture id0Sch  ·  4Kommentare