Es ist üblich, wenn der Benutzer Variablen aus dem Modul importieren möchte, ohne das Modul in einer Variablen zu speichern, z
let {Schema} = require('mongoose');
oder
var Schema = require('mongoose').Schema;
aber wenn ich das mit model mache
var model = require('mongoose').model;
und versuche ein Modell mit importierter Funktion zu erstellen, ich habe einen Fehler
TypeError: Cannot read property 'modelSchemas' of undefined
Ja, model ist eine Eigenschaft von Mongoose.prototype, aber auch Schema.
Wenn die Dokumentation eine Anweisung enthält wie
var Schema = mongoose.Schema,
...
Es ist möglich anzunehmen, dass 'Modell' ein ähnliches Verhalten haben wird
Dieses Verhalten zu unterstützen würde eine massive Umgestaltung von Mungos-Verbindungen erfordern. Um es kurz zu machen, require('mongoose').model();
unterscheidet sich von var model = require('mongoose').model; model();
weil der Wert von this
im vorherigen Funktionsaufruf das Singleton require('mongoose');
, während es das globale Objekt ist im letzteren Aufruf. Wenn Sie eine Problemumgehung wünschen, sollte model.call(require('mongoose'), 'MyModelName', schema);
funktionieren. Ich bin kein großer Fan der Tatsache, dass die Top-Level-Funktionen von Mongoose mit Nebenwirkungen beladen sind, aber um das loszuwerden, müssten wir auch die mongoose.model()
Getter-Syntax loswerden, die einen brechen würde Code vieler Leute.
@vkarpov15 danke für deine Antwort!
Es gibt 2 verschiedene Fälle:
Wenn das Problem offen ist, kann es mit Breaking Change (in der neuen Hauptversion) oder ohne Breaking Change (Sie wissen, alles kann mit Abwärtskompatibilität umgestaltet werden, es hängt nur vom Aufwand ab) behoben werden. Jemand (zB ich) hat wahrscheinlich Zeit dafür.
Aber wenn wir das Problem als geschlossen markieren, geben wir den Mitwirkenden bekannt, dass Pull-Requests mit der Behebung dieses Fehlers abgelehnt werden und jemand nicht einmal damit beginnt, ihn zu beheben.
Was denkst du darüber?
Fairer Punkt, ich werde dieses Thema offen halten. Die Problemumgehung ist einfach, stellen Sie einfach sicher, dass die Funktionen den richtigen Kontext haben. Die endgültige Lösung ist keine Nebenwirkungen.
+1
Das funktioniert derzeit nicht:
import { model } from 'mongoose'
Aufgrund von Nebenwirkungen bei Mungos wird in naher Zukunft keine Wirkung erwartet. Keine wirklich gute Möglichkeit, mongoose.model()
als Getter/Setter zu verwenden, wenn Sie import { model }
sei denn, Sie verwenden den globalen Zustand, was ich nicht tun möchte. Warum verwendest du nicht einfach import 'mongoose';
? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
Ich gebe diesem +1.
import { model } from 'mongoose'
^ ist eine praktische/attraktive Syntax.
Ich habe #3943 als schnelle Lösung dafür erstellt. Wenn es akzeptabel ist (bis eine bessere Lösung erstellt werden kann), kann ich einen Test zum PR schreiben. Wenn es überhaupt überarbeitet werden muss, bin ich mehr als bereit, dies zu tun.
Ich mag die allgemeine Idee, aber Tests scheitern in diesem PR, was leider ein Deal Breaker ist
Ja, das habe ich gesehen. Ich werde morgen damit spielen, um zu sehen, was los ist
an.
Am Samstag, 5. März 2016, 17:45 Uhr schrieb Valeri Karpov [email protected] :
Ich mag die allgemeine Idee, aber Tests scheitern in diesem PR, was ein Deal ist
leider unterbrecher—
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/Automattic/mongoose/issues/3768#issuecomment -192769531
.
Bin heute darauf gestoßen, nachdem ich const { model } = require('mongoose');
versucht hatte
Unnötig zu erwähnen, dass es nicht funktioniert hat, also zurück zu let foo = mongoose.model('foo',fooSchema);
Seien Sie nett, wenn jemand Zeit für eine Lösung hat, aber ich kann verstehen, warum es keine hohe Priorität hat!
Also, um zu versuchen, es zu klären, laufe
import { model } from 'mongoose';
//...
model('testModel', testModelSchema);
...macht das model
Objekt dem globalen Namensraum zugänglich, während
import mongoose from 'mongoose';
//...
mongoose.model('testModel', testModelSchema);
platziert das Modell in den Geltungsbereich des bereits verbundenen Mungo-Singleton-Objekts. Kann mir das bitte jemand bestätigen.
Danke
@cr05s19xx das ist im Allgemeinen richtig. Im ersteren ist this
der globale Namespace, aber im letzteren bezieht sich this
in model()
auf den Mungo-Singleton
Wenn dieser Fehler nur auftritt, wenn wir dieses Problem haben, wäre es von Vorteil, die Ursache auszudrucken und zu beheben, damit die Leute nicht wie ich googeln müssen und zu diesem Problem kommen.
In 5.3.14 können Sie import {model} from 'mongoose'
ausführen und es wird ordnungsgemäß funktionieren. Dies ist jedoch nur für diese eine Funktion erforderlich, wir benötigen jedoch noch mehr Arbeit, um dies für den Rest der globalen Mongoose-API zu unterstützen . Wir werden trotzdem davor warnen und den Abschnitt in den FAQ beibehalten , aber der Musterfall ist so häufig, dass wir ihn einmalig beheben können.
Hilfreichster Kommentar
+1
Das funktioniert derzeit nicht: