Freigeben von Daten zwischen den Midgouse-Methoden von Mongoose zum Speichern und Speichern

9

SIEHE UPDATED BEISPIEL CODE @ BOTTOM

Ich verwende in meinen aktuellen NodeJS-Projekten Mongoose (was übrigens super ist!) und ich habe eine MDB-Sammlung, die die Änderungen von Dokumenten in einer anderen Sammlung speichert (im Grunde ein changelog ) Speichern, was geändert wurde)

Wie ich das erreichen möchte, muss eine Funktion erstellt werden, die eine JSON-Version des Dokuments speichert, die über den pre('save') -Hook erfolgt. Erstellen Sie dann einen weiteren Hook, der über post('save') ausgeführt wird, um die in pre('save') gespeicherten Daten zu vergleichen und vergleichen Sie sie mit den Dokumenten new data.

Heres was ich bis jetzt habe:

%Vor%

Ich dachte ursprünglich, das würde nicht funktionieren. Um zu testen, dass die beiden Hooks im selben Umfang ausgeführt werden, habe ich oben auf der Seite eine Testvariable namens testVar mit einem beliebigen Wert erstellt und dann im post(save) Hook die testVar und den Wert abgerufen Änderung der Variablen wurde im Post-Speichern-Hook gesehen.

Von da an habe ich einfach den Wert von this.toJSON() in einer Variablen gespeichert, dann versuche ich im Post (save) Hook die zwischengespeicherte Version dieses Dokuments zu finden und mit this.toJSON() zu vergleichen. Es sieht jedoch nicht so aus, als ob das Dokument von pre(save) nicht die vormodifizierten Daten enthält, sondern irgendwie den Wert des Dokuments nachdem es aktualisiert wurde.

Warum kann ich also den Wert von testVar innerhalb eines pre(save) Hooks aktualisieren, und diese Änderung wird von einer post(save) Hook-Funktion reflektiert, aber ich kann das gleiche mit dem Dokument selbst nicht machen?

Ist das, was ich hier versuche, überhaupt möglich? Wenn ja, was mache ich falsch? Wenn nicht - Wie kann ich das erreichen?

Danke

Aktualisieren

Nach dem Rat von @Avraam habe ich versucht, die Daten über JSON.stringify() zu speichern, bevor sie im Speicher über den pre(save) -Hook gespeichert wurden, und dann dasselbe in post(save) , so:

%Vor%

Und hier ist das Skript, das das Mungo-Dokument aktualisiert:

%Vor%

Hier ist die Konsolenausgabe, wenn ich das neue Skript starte:

%Vor%

Wie Sie sehen, zeigen der Wert [QUERY] ORIGINAL und die [QUERY] AKTUALISIERTEN -Werte, dass ein Update stattgefunden hat. Aber die [MIDDLEWARE] ursprünglichen / aktualisierten Werte sind immer noch die gleichen ... So bin ich immer noch fest, warum

AKTUALISIEREN

Ich dachte, ich könnte vielleicht ein einfacheres, aber ausführlicheres Beispiel liefern.

Hier ist das Middleware-Modul, das die pre(save) und

vergleichen soll

post(save) :     'verwenden Sie streng'

%Vor%

Dann wird der Code, der das Asset -Modell verwendet, aktualisiert und das Attribut Description aktualisiert ...

%Vor%     
Justin 23.09.2016, 07:12
quelle

5 Antworten

1

Ok, der erste Teil Ihrer Frage wird von Avraam Mavridis korrekt beantwortet deshalb werde ich mich nur auf dein letztes Update in der Frage konzentrieren.

pre.save tatsächlich nicht enthält das aktuelle Dokument, das derzeit in der Datenbank existiert, sondern es ist das Dokument, das gespeichert wird und enthält die Änderungen, die am Dokument vorgenommen wurden, d das aktualisierte Dokument.

post.save enthält das reale Dokument, das in der Datenbank gespeichert ist, also immer noch die aktualisierte Version. Sie können also die vorgenommene Änderung nicht sehen, indem Sie this sowohl in pre als auch in post save betrachten.

Wenn Sie jetzt die realen Werte sehen wollen, die in der Datenbank existierten, müssen Sie sie aus der Datenbank holen, bevor sie geändert und gespeichert wird, d. h. in pre.save .

Eine Möglichkeit besteht darin, das Dokument einfach aus der Datenbank abzufragen %Vor%

Es gibt eine andere Möglichkeit als die Verwendung von benutzerdefiniertem Setter, und es gibt bereits eine gute Antwort hier , aber dies müsste festgelegt werden ein benutzerdefinierter Setter für jede Eigenschaft %Vor%

Hoffe, das hilft.

    
Naeem Shaikh 30.09.2016 06:27
quelle
0

Ich glaube, Sie verstehen falsch, wie die Pre / Post-Haken in Mangusten funktionieren. Wenn Sie das Dokument greifen (wie Sie es tun) und es erneut speichern. Es wird nicht die Variable enthalten, die ursprünglich im Dokument enthalten war. Es wird haben, was gerade im Dokument ist.

Also machst du das:

  1. Grab Dokument (67)
  2. Dokument ändern & lt; (Du hast hier +1 gemacht) (jetzt 68)
  3. Document.Save () wird
  4. genannt
  5. Speichern Sie den Ausdruck des aktuellen Dokuments (68)
  6. vor
  7. Speichern Sie das aktuelle Dokument nach dem Speichern erneut (68)

Ich denke, Sie wollen eine Instanzmethode für Ihr Schema implementieren, mit der Sie die gewünschte Logik definieren können. Sie würden dies aufrufen, bevor Sie .save () aufrufen (oder verwenden Sie einfach, um .save () aufzurufen, nachdem Sie Ihre eigene Logik ausgeführt haben)

Beispiel:

%Vor%

Hoffe, das hilft

Lesen Sie mehr: Ссылка

    
Patrick Quintal 24.09.2016 06:45
quelle
0

origDocument haben die Referenz von this.toJSON, also, wenn this.toJSON in post geändert ('save') origDocument auch geändert werden. Probieren Sie den folgenden Code aus:

%Vor%

Mit JSON.parse (JSON.stringify ()) habe ich die Referenz gelöscht.

Hoffe, das hilft !!!

    
Sachin 28.09.2016 05:53
quelle
0

Sie können noch eine weitere Middleware verwenden und den aktuellen Wert vorübergehend auf ein nicht definiertes Attribut setzen (so wird es bei save call nicht in der Datenbank gespeichert).

z. B.

%Vor%

Und dann in Post speichern hook den Vergleich:

%Vor%     
Jakub Koral 01.10.2016 11:35
quelle
0

Der origDocument verweist auf this.toJSON() und in dem Moment, in dem Sie console.log aufrufen, den Wert des tatsächlichen Objekts, an dem sich die Referenzpunkte bereits geändert haben. Verwenden Sie etwas wie JSON.stringify , um die Werte zu vergleichen.

origDocument = JSON.stringify( this.toJSON() )

    
Avraam Mavridis 23.09.2016 10:34
quelle