Mongoose: Erlaube `import { model } from mungo`

Erstellt am 16. Jan. 2016  ·  14Kommentare  ·  Quelle: Automattic/mongoose

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

enhancement

Hilfreichster Kommentar

+1

Das funktioniert derzeit nicht:

import { model } from 'mongoose'

Alle 14 Kommentare

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:

  1. Wir wissen, dass es sich um einen Fehler handelt, aber das Refactoring dauert seine Zeit, um ihn zu beheben. Dann sollten wir das Thema offen halten
  2. Wir behaupten, dass es sich nicht um einen Bug handelt. Dann sollten wir das Thema schließen

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen