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
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:
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
Ich dachte, ich könnte vielleicht ein einfacheres, aber ausführlicheres Beispiel liefern.
Hier ist das Middleware-Modul, das die pre(save)
und
post(save)
:
'verwenden Sie streng'
Dann wird der Code, der das Asset
-Modell verwendet, aktualisiert und das Attribut Description
aktualisiert ...
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.
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:
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: Ссылка
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% 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() )
Tags und Links javascript node.js mongodb mongoose mongoose-schema