Mongoose: Verfallswarnung

Erstellt am 1. Juli 2016  ·  79Kommentare  ·  Quelle: Automattic/mongoose

Ich bekomme diese Warnung

(node:3341) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

nachdem ich es getan habe

driver.createCar({
          carName: 'jeep',
          availableSeats: 4,
        }, callback);

driver ist eine Instanz der Driver-Klasse

const carSchema = new Schema({
  carName: String,
  availableSeats: Number,
  createdOn: { type: Date, default: Date.now },
});
const driverSchema = new Schema({
  email: String,
  name: String,
  city: String,
  phoneNumber: String,
  cars: [carSchema],
  userId: {
    type: Schema.Types.ObjectId,
    required: true,
  },
  createdOn: { type: Date, default: Date.now },
});
const DriverModel = mongoose.model('Driver', driverSchema);

class Driver extends DriverModel {
  getCurrentDate() {
    return moment().format();
  }
  create(cb) {
    // save driver
    this.createdOn = this.getCurrentDate();
    this.save(cb);
  }
  remove(cb) {
    super.remove({
      _id: this._id,
    }, cb);
  }
  createCar(carData, cb) {
    this.cars.push(carData);
    this.save(cb);
  }
  getCars() {
    return this.cars;
  }
}

Irgendwelche Gedanken darüber, was ich falsch mache?

help

Hilfreichster Kommentar

Ich habe diese Warnung gelöst

mongoose.Promise = global.Promise;

Direkt vor dem Aufruf von mongoose.connect

// connect to mongo function
core.connect = function connect(opts) {
  mongoose.Promise = global.Promise;
  mongoose.connect(`mongodb://${opts.server}:${opts.port}/${opts.db}`);
  return mongoose.connection;
};

Alle 79 Kommentare

Hmm, benutzt du irgendwo Versprechungen? Sie sollten diese Warnung nicht erhalten, es sei denn, Sie verwenden Versprechen ...

nein, ich verwende keine Versprechungen

Ich habe gerade angefangen, dieses Problem auch zu bekommen. Keine mir bekannten Versprechen verwenden!

Ich habe diese Warnung gelöst

mongoose.Promise = global.Promise;

Direkt vor dem Aufruf von mongoose.connect

// connect to mongo function
core.connect = function connect(opts) {
  mongoose.Promise = global.Promise;
  mongoose.connect(`mongodb://${opts.server}:${opts.port}/${opts.db}`);
  return mongoose.connection;
};

Ja, diese Warnung soll Ihnen sagen, dass Sie die Standardversprechungsbibliothek von Mungos ändern sollen, wenn Sie Versprechungen verwenden, aber es sollte nicht passieren, es sei denn, Sie rufen .then irgendwo an

Ich bekomme es, aber ich bekomme es nur, wenn ich ein Objekt speichere, es dann im Rückruf ändere und erneut speichere

Ich habe den @SAudelOG- Ansatz ausprobiert, um Mungo ein Versprechen zuzuweisen, bevor Mungo eine Verbindung herstellt, aber ich erhalte immer noch diesen Fehler

Ich verwende asynchrone Funktionen es7, und mein Code wird blockiert, wenn ich versuche, Model.findOne({})

Die Lösung @SAudeLOG bietet funktioniert. Wie bei @IrishAdo erhalte ich dies nur, wenn ich auch ein Objekt speichere. Vielleicht liegt es an einem der Mongoose-Plugins, die ich mit der Bluebird Promise Library verwende.

Hier ist eine Liste der Abhängigkeiten, die ich verwende

  "dependencies": {
    "async": "^2.0.0-rc.6",
    "body-parser": "^1.15.0",
    "bower": "^1.7.7",
    "compression": "^1.6.1",
    "connect-mongo": "^1.2.1",
    "consolidate": "^0.14.1",
    "cookie-parser": "^1.4.3",
    "express": "^4.13.4",
    "express-jwt": "^3.4.0",
    "express-session": "^1.13.0",
    "express-validator": "^2.20.8",
    "faker": "^3.1.0",
    "http-errors": "^1.5.0",
    "jsonwebtoken": "^7.0.1",
    "lodash": "^4.13.1",
    "method-override": "^2.3.5",
    "mongoose": "^4.4.3",
    "mongoose-beautiful-unique-validation": "^3.0.0",
    "mongoose-delete": "^0.3.3",
    "mongoose-validator": "^1.2.5",
    "morgan": "^1.6.1",
    "passport": "^0.3.2",
    "passport-local": "^1.0.0",
    "swig": "^1.4.2"
  }

Ich verwende weder Plugins noch Promises und erhalte auch diese Warnung (auf [email protected]).

Wenn ich meine App mit "--trace-deprecation" ausführe, habe ich:

Trace: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead:
http://mongoosejs.com/docs/promises.html
    at Object.exports._printDeprecationMessage (internal/util.js:30:13)
    at Promise.deprecated [as then] (internal/util.js:54:22)
    at fnWrapper (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:188:11)
    at EmbeddedDocument.Object.defineProperty.value.fn (.\node_modules\mongoose\lib\schema.js:219:11)
    at _next (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:62:30)
    at fnWrapper (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:186:18)
    at EmbeddedDocument.Object.defineProperty.value.fn (.\node_modules\mongoose\lib\schema.js:173:18)
    at EmbeddedDocument._next (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:62:30)
    at EmbeddedDocument.proto.(anonymous function) [as $__original_save] (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:108:20)
    at .\node_modules\mongoose\lib\document.js:1917:24
    at new Promise.ES6 (.\node_modules\mongoose\lib\promise.js:45:3)
    at EmbeddedDocument.wrappedPointCut [as save] (.\node_modules\mongoose\lib\document.js:1893:14)
    at async.each.i (.\node_modules\mongoose\lib\schema.js:225:18)
    at .\node_modules\async\lib\async.js:181:20
    at Object.async.forEachOf.async.eachOf (.\node_modules\async\lib\async.js:233:13)
    at Object.async.forEach.async.each (.\node_modules\async\lib\async.js:209:22)
    at model.Object.defineProperty.value.fn (.\node_modules\mongoose\lib\schema.js:223:15)
    at _next (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:62:30)
    at fnWrapper (.\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:186:18)
    at .\node_modules\mongoose\lib\schema.js:200:17
    at .\node_modules\mongoose\node_modules\kareem\index.js:127:16
    at nextTickCallbackWith0Args (node.js:420:9)
    at process._tickDomainCallback (node.js:390:13)

Ich habe das gleiche Problem, wenn es eine Hilfe ist, wird es speziell ausgelöst, wenn ich versuche, Dokumente zu erstellen, die eine Reihe von Unterdokumenten enthalten, etwa so:

var data = {
  field: 'value',
  another_field: [{subdocfield1: 'value', subdocfield2: 'value'}]
} 

mySchema.create(data, cb)

Es tritt nicht bei anderen Sammlungen auf, die keine Subdocs haben, es passiert nicht einmal, wenn ich die create-Anweisung ohne die Subdoc-Daten wie folgt ausgebe:

var data = {
  field: 'value'
} 

mySchema.create(data, cb)

_Hinweis:_ mongoose.Promise = global.Promise hat das Warnproblem für mich jedoch gelöst

Die gleiche Abschreibungswarnung wird angezeigt, wenn ich remove() in einem Dokument verwende. Ich verwende hier oder anderswo in meinem Code keine Versprechungen.

Ich habe gerade diesen Fehler bei der Verwendung Model.create(objects, callback); erhalten, vielleicht wurde dieser Fix noch nicht für npm veröffentlicht?

Das zu bekommen, froh, es zu lesen, ist nicht alarmierend. Ich werde mir das genauer ansehen, um beim Debuggen zu helfen, wenn es passiert.

Ich bekomme das auch, und ich benutze nirgendwo Mungo-Versprechungen.

Ich konnte es auf einen model.save -Aufruf innerhalb eines Callbacks der Bibliothek on-headers zurückführen , und das Modell wurde außerhalb des Callbacks erstellt, bevor es aufgerufen wurde, falls es jemandem hilft. Es macht keinen Unterschied, ob Sie sowohl die Modellerstellung als auch den Speicheraufruf in den Rückruf einfügen.

Angesichts dieses Problems auf dem Knoten v4.4.6, während dies auf v4.4.2 zu funktionieren scheint

@SKatiyar Codebeispiel bitte

Dasselbe gilt für mich, wenn ich diese Nachricht nach dem Aufrufen der Methode save () erhalte, reicht es mir, mich darum zu kümmern

Das funktioniert! Fügen Sie vor mongoose.connect(MONGO_URI); mongoose.Promise = global.Promise; hinzu

Der folgende Code reicht aus, um auf meiner Seite zu reproduzieren:

const mongoose = require('mongoose');
const schema = new mongoose.Schema({
  data: { type: Number }
});
const Model = mongoose.model('schema', schema);
mongoose.connect('mongodb://127.0.0.1:27017/somedatabase');
const newModel = new Model({ data: 1 });
const save = newModel.save(() => {
  console.log('saved model');
});
console.log(typeof save.then); //=> 'function'

Seltsamerweise kann ich hier sehen, dass die Verwendung newModel.save(callback) immer noch ein Versprechen zurückgibt (oder ich gehe davon aus, dass dies ein Versprechen ist, da der Typ von .then 'function' ist). Ist das erwartetes Verhalten?

Hier meine Versionen:
Knoten: v6.3.1
Mungo: v4.5.8

Lassen Sie mich wissen, wenn Sie weitere Informationen von mir benötigen.

@dvlsg ja, das ist derzeit das erwartete Verhalten, save gibt immer ein Versprechen zurück, auch wenn Sie einen Rückruf übergeben

Nun, ich denke, das würde zumindest erklären, warum die Leute die Versprechungswarnung sehen, selbst wenn sie nicht glauben, dass sie Versprechen verwenden.

Das erklärt alles.. Ich bin nur etwas paranoid und wollte die ganze Warnung loswerden 💃

Es ist meine Schuld, yup .save() gibt ein Versprechen zurück, also wird dies erwartet, aber trotzdem hat mich die Warnung gewundert. http://mongoosejs.com/docs/promises.html (musste nur den ersten Absatz lesen 🎱)

.save() gibt also ein Versprechen zurück, aber Sie sollten diese Warnung nicht erhalten, es sei denn, Sie rufen .then() . Wenn Sie diese Warnung erhalten, ohne .then() in Ihrem Code aufzurufen, bedeutet das, dass Mongoose irgendwo ein Versprechen verwendet, wo es nicht sein sollte, also öffnen Sie bitte ein separates Problem mit Codebeispielen :+1:

IMHO sollte diese Meldung eher ein Fehler ("Dinge funktionieren nicht") als eine Warnung ("Pass auf, aber es sollte funktionieren") sein, da sie tatsächlich als Fehler im Rückruf zurückgegeben wird.

Ich bin auf dieses Problem gestoßen und die Methode „Model.save()“ hat nicht funktioniert, um sie in MongoDB einzufügen. Es dauerte einige Zeit, die Ursache für dieses Problem zu finden. Nach dem Anwenden von "mongoose.Promise = global.Promise;" war es erfolgreich.

Ich habe "Mongoose" verwendet: "^4.5.9".

Speichern sollte mit der standardmäßigen Promise-Bibliothek problemlos funktionieren. Können Sie ein Codebeispiel bereitstellen?

@vkarpov15

Du hast recht. Ich habe gerade versucht und es nicht geschafft, das blockierende Speicherergebnis mit der Warnung neu zu erstellen.

Ich bin mir nicht sicher, ob es mit anderem Code in meinem Projekt zusammenhängt. brauche etwas zeit zum checken. Bitte ignorieren, bevor ich die Ursache herausfinde.

Für mich erscheint dieses Protokoll immer dann in der Konsole, wenn ich .then() verwende, es spielt keine Rolle, ob es mit einem Mungo-Objekt oder einem anderen Objekt verwendet wird, das nichts mit Mungo zu tun hat

Also, wie in den Dokumenten steht, gehe ich vorbei

'use strict';
var Promise = require('bluebird');

// Development specific configuration
// ==================================
module.exports = {
  // MongoDB connection options
  mongo: {
    uri: 'mongodb://localhost/fullstack-dev',
    options: {
      promiseLibrary: Promise
    }
  },
  // .. other config
};

Dann in meiner Hauptdatei tun

'use strict';

// Set default node environment to development
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
process.env.BLUEBIRD_DEBUG = 1;
var mongoose = require('mongoose');
var config = require(path.join(__dirname, 'server', 'config', 'environment'));

// Connect to database
var db = mongoose.connect(config.mongo.uri, config.mongo.options);
mongoose.connection.on('error', function(err) {
  console.error('MongoDB connection error: ' + err);
  process.exit(-1);
});

Und ich erhalte immer noch die Verfallswarnung, wenn ich query.exec mache. Irgendwelche Vorschläge, was ich falsch mache?
[Bearbeiten: Mungo- und Bluebird-Versionen hinzufügen]
Ich verwende Mongoose ^4.6.1 , Bluebird ^3.4.6

Ich erhalte auch eine Warnung auf Mongoose 4.6.1 und Knoten 4.4.5

    var mongoose = require('mongoose');
    mongoose.Promise = global.Promise;
    mongoose.connect(dbConfig);
    var connection = mongoose.connection;

@manu29d sieht so aus, als würden Sie mongoose.Promise = bluebird nicht einstellen

@ vkarpov15 Ich denke schon. Ich habe am Anfang des Konfigurationsskripts var Promise = deklariert und später dann promiseLibrary: Promise . (Schauen Sie sich das erste Code-Snippet in den Beispielen an.)

Außerdem habe ich versucht, promiseLibrary: require('bluebird') zu schreiben, wie es in den Dokumenten angegeben ist.

Ich sehe mongoose.Promise = require('bluebird') nirgendwo in dem von Ihnen bereitgestellten Codebeispiel. var Promise = require('bluebird'); ist _nicht_ richtig.

@vkarpov15 Ich beziehe mich auf http://mongoosejs.com/docs/promises.html#promises -for-the-mongodb-driver

Gilt das noch? Ich habe keine Zeit, den Code zu überprüfen, ob diese Option ( promiseLibrary ) in der Konfiguration noch unterstützt wird oder entfernt wurde.

Das Setzen mongoose.Promise = global.Promise funktioniert aber.

mongoose.Promise = global.Promise
bevor mongoose.connect auch bei mir funktioniert.

Ich verwende keine Versprechungen und rufe mongoose.Promise = global.Promise an, bevor die Verbindung funktioniert.

@manu29d diese Dokumente sind korrekt, aber wenn Sie sie tatsächlich lesen, werden Sie sehen, dass die Option promiseLibrary nur den zugrunde liegenden Mongodb-Treiber betrifft, _nicht_ Mongoose-Modelle.

@zubair-farooqui-10p das folgende Skript löst die Warnung für mich in 4.5.9 oder 4.6.3 nicht aus:

'use strict';

Error.stackTraceLimit = Infinity;

var assert = require('assert');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/gh4291');
mongoose.set('debug', true);

var connection = mongoose.connection;

Es ist wirklich ärgerlich, dass Sie diese zusätzliche Zeile hinzufügen müssen. Gibt es eine Möglichkeit für Mungo, dies in ihrer internen Bibliothek zu beheben? Danke!

Nicht im Allgemeinen, denn die Art und Weise, wie der Versprechen-Lib-Umschaltmechanismus von Mongoose funktioniert, unterscheidet sich stark von der Funktionsweise des Mongodb-Treibers. In Mongoose ist es nur eine Eigenschaft, die Sie jederzeit für das globale Mongoose-Objekt festlegen können, während es im Mongodb-Treiber eine Verbindungsoption ist, sodass verschiedene Verbindungen unterschiedliche Promise-Bibliotheken haben können, aber Sie können die Promise-Bibliothek nur festlegen, wenn Sie eine Verbindung herstellen. nicht danach. Es ist nicht wirklich eine Priorität, diese Unterschiede atm auszugleichen.

Warum dies beim Speichern eines Dokuments mit einer Reihe von Zeichenfolgen passiert, könnte jemand näher erläutern

Ich bekomme es auch, nachdem ich nur .createConnecton() angerufen habe. Das Lustige ist, dass ich Q benutze ... ABER! Aber ich ziehe es vor, es zu tun, nachdem ich eine Verbindung hergestellt habe, weil ich (und ich bin mir ziemlich sicher, dass alle) es vorziehen, es im var-Deklarationsblock zu tun. dh

var mongoose = require('mongoose'),
        connection1 = mongoose.createConnection(dbConn1Str),
        connection2 = mongoose.createConnection(dbConn2Str)
;
mongoose.Promise = Q.makePromise;

Um diese Warnung loszuwerden, muss ich stattdessen Folgendes tun:

var mongoose = require('mongoose'),
        connection1, connection2
;
mongoose.Promise = Q.makePromise;
connection1 = mongoose.createConnection(dbConn1Str)
connection2 = mongoose.createConnection(dbConn2Str)

Keine große Sache, aber srsly ...

Ja, das ist der Weg zu gehen. Mongoose 4.x verwendet mpromise, bis Sie ihm sagen, dass dies nicht der Fall sein soll.

Ich sehe dies, wenn ich den regulären find () -Aufruf mit dem Abfragehelfer verwende. Ich verwende then nirgendwo.

BookStore.find().byUsingQueryHelper(1,2,3).lean().exec(function (err, docs) { ... })

Protokoll:

Mongoose: bookstores.find({ location: { '$near': [ 28.742712943610545, -13.865369983731426 ], '$maxDistance': 0.0012556898446083817 } }, { limit: 10, fields: undefined })

(node:82366) DeprecationWarning: Mongoose: mpromise (die standardmäßige Promise-Bibliothek von Mongoose) ist veraltet, schließen Sie stattdessen Ihre eigene Promise-Bibliothek an: http://mongoosejs.com/docs/promises.html

@pronebird leider funktioniert exec() so intern, Rückrufe an exec() gehen tatsächlich durch ein Versprechen. Mach einfach mongoose.Promise = global.Promise und du solltest diese Warnung nicht mehr bekommen.

@pronebird Ich habe beim Posten den gleichen Fehler erhalten und herausgefunden, dass mein Schema einen Standardwert wie unten gezeigt hat und nicht mit meinem unten geposteten Wert übereinstimmt
Rolle: {
Typ: Zeichenkette,
enum: ['Kunde', 'Admin'],
Standard: 'Kunde'
}
Ich poste role:admin und es sollte Admin sein
hoffe diese antwort hilft jemandem. Danke

@Muhammedalbayati Ich glaube nicht, dass Ihr Problem etwas mit diesem speziellen Problem zu tun hat? Es ist nur eine Warnung von Mongoose bezüglich Versprechungen.

@varunjayaraman du hast recht, ich sollte folgendes erwähnen
die Warnung
DeprecationWarning: Mongoose: mpromise (die standardmäßige Promise-Bibliothek von Mongoose) ist veraltet, schließen Sie stattdessen Ihre eigene Promise-Bibliothek an: http://mongoosejs.com/docs/promises.html

verschwindet durch Hinzufügen von mongoose.Promise = global.Promise; bevor du dich mit der db verbindest
mongoose.connect('mongodb://localhost:27017/mydb');

@Muhammedalbayati Ich denke, @vkarpov15 hat erklärt, warum diese Warnung erscheint. Mongoose verwendet Versprechungen intern innerhalb exec .

ES6 "yiled" funktioniert einfach nicht mit der doc.save-Methode, nachdem ich Mungo auf v.4.7.7 aktualisiert habe.
Schließlich ist es nur weil mongoose.Promise = global.Promise . Nachdem ich dies entfernt habe, warnt es immer noch

Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead:

Ich denke, [email protected] hat ein eigenes Promise-Modul. Ist das richtig??
Kennt es jemand?

Es ist Mungo, füge eine es6-Promise-Bibliothek hinzu.

So blödes Thema!

PS: Schiebe diese verdammte Warnung in deine Fotze!

Als ein russischsprachiger Mitmensch entschuldige ich mich für das Verhalten dieses geringeren Wesens und drängte Sie, das, was es hier geschrieben hat, nicht zu übersetzen.

@vkarpov15 Ich habe sowohl mongoose.Promise = global.Promise; als auch mongoose.Promise = require('bluebird'); ausprobiert.

Leider erhalte ich immer noch die Deprecation-Warnung.

_Mache ich etwas falsch?_

const mongoose = require('mongoose');

mongoose.Promise = global.Promise;

mongoose.connect('mongodb://localhost/users_test');

mongoose.connection
  .once('open', () => {
    console.log('connectecd to db')
  })
  .on('error', (err) => {
    console.warn('Warning', err)
  });

@protoEvangelium Importieren Sie Mungo an anderer Stelle in Ihre App? Wird Mongoose zum ersten Mal verwendet oder wird diese Datei in eine andere Datei importiert?

Welche Version von Mongoose /node verwenden Sie außerdem?

@varunjayaraman Diese Datei wird nirgendwo anders importiert. Allerdings importiere ich Mongoose in meine user.js-Schemadatei und verwende dieses Benutzerschema dann in einigen meiner Tests.

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const UserSchema = new Schema({
  name: String,
})
const User = mongoose.model('user', UserSchema)
module.exports = User

Knoten v7.0.0Mungo v4.8.1

@protoEvangelium bekommst du die Warnung in deiner App oder nur in deinen Tests?

Ich hatte einmal das gleiche Problem - der Übeltäter war ein anderes Modul, das seine eigene Mungo-Abhängigkeit verwendete. Solche Module haben so etwas wie "mongoose": "^4.1.1" in ihrer package.json, aber da diese Module (wenn überhaupt) jährlich aktualisiert werden, fehlt ihnen der Promise-Konfigurationsteil. @protoEvangelium verwenden Sie andere Module?

@SAudeLOG Danke für die Antwort

@varunjayaraman Ich habe gerade erst begonnen, das Hinzufügen von Benutzern zu Mongo mit Mongoose und Mocha zu testen. Bisher ist es ein Barebone-Projekt.

@Spown Ich benutze:
"mocha": "^3.2.0", "mongoose": "^4.8.1", "nodemon": "^1.11.0"

Danke :)

@protoEvangelium Moment mal , hast du das probiert?

const mongoose = require('mongoose')
mongoose.Promise = global.Promise // <--
const Schema = mongoose.Schema
const UserSchema = new Schema({
  name: String,
})
const User = mongoose.model('user', UserSchema)
module.exports = User

Wenn Sie ein Modell aus einer Mungo-Instanz erstellen, deren Versprechen nicht neu definiert wurde, würde jede Abfrage dieses Modells die Warnung auslösen.

@Spown

Ich bin zur richtigen Zeit auf diesen Thread gestoßen. Ich erhielt die gleiche Warnung jedes Mal, wenn ich Informationen speicherte. Es stellte sich heraus, dass ich ein Modell aus einer Mongoose-Instanz erstellt und es nicht neu definiert habe. Bluebird erforderlich und auf mongoose.Promise setzen löste die Fehlermeldung.

Vielen Dank!

@Spown Danke, Herr! Das war das Problem. Interessanterweise habe ich mongoose.Promise = global.Promise; in meiner Datei test_helper.js definiert , kurz bevor ich mich mit Mongoose verbunden habe. Ich habe mongoose.Promise = global.Promise; auf meine Datei umgestellt, wo ich das Schema definiert habe und es funktioniert!!!! Keine Abwertungswarnung mehr 👍

const mongoose = require('mongoose')
mongoose.Promise = global.Promise;
const Schema = mongoose.Schema

Ich erhalte dieses Problem, wenn ich „befüllbare“ virtuelle Objekte in meinen Schemas verwende. Wenn Sie meine App mit --trace-deprecations ausführen, können Sie den Übeltäter sehen:

(node:8846) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
    at model.wrappedPointCut [as init] (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mongoose/lib/services/model/applyHooks.js:141:26)
    at completeMany (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mongoose/lib/query.js:1254:12)
    at Immediate.cb (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mongoose/lib/query.js:1117:13)
    at Immediate.<anonymous> (/Users/fleavamini/Projects/stellium/stellium-express/node_modules/mquery/lib/utils.js:137:16)
    at runCallback (timers.js:651:20)
    at tryOnImmediate (timers.js:624:5)
    at processImmediate [as _immediateCallback] (timers.js:596:5)

Ich habe das Versprechen gesetzt (beachten Sie, dass ich TypeScript verwende):

import * as mongoose from "mongoose";
(<any>mongoose).Promise = global.Promise;
mongoose.connect('mongodb://localhost/blah')

Irgendwelche Ideen? Sollte ich das Versprechen für jedes Modell festlegen, das „befüllbare“ virtuelle Elemente verwendet? Warten Sie, ich werde das tatsächlich versuchen und zurückkommen, wie es gelaufen ist.

Okay, nach einigem Herumbasteln habe ich herausgefunden, dass ich immer noch Promise in meinem Schema setzen muss, selbst wenn ich es in index meines Servers gesetzt habe.

In meinem Fall war die website_pages -Sammlung die erste Sammlung, die jemals von meinem System abgefragt wurde. Das Festlegen von mongoose.Promise auf global.Promise allein in diesem Schema hat das Problem behoben, und ich war es Es ist nicht erforderlich, es in allen Schemas festzulegen.

Warum sollte man ES6 Promises nicht verwenden? Gibt es die jetzt nicht überall?

mongoose.Promise = Promise; // eh?

Danke @Spown , ich wurde mit der gleichen Abwertungswarnung konfrontiert, seit ich nach dem Importieren des Modells mongoose.Promise = global.Promise eingefügt habe. Jetzt ist die Abwertungswarnung weg.

Das Deklarieren mongoose.Promise = global.Promise in der Modelldatei, wie von @Spown erwähnt, funktioniert. Dies liegt daran, dass der Knoten erforderliche Module zwischenspeichert . Dies scheint jedoch unbeständig. Gibt es keine Möglichkeit sicherzustellen, dass test_helpers.js zuerst geladen wird, damit ich die Versprechenfunktion von Mongoose in dieser Datei festlegen kann?

Gibt es keine Möglichkeit, dafür zu sorgen, dass ...

Ich persönlich require mongoose nur einmal in meinen Projekten, dann stecke ich es in ein globales Singleton-Objekt und verwende es überall für alle DB-Zwecke. Nicht gerade anmutig, aber meistens kugelsicher. und ich habe es lange vor der Verwerfungssache gemacht, einfach weil, wenn Sie eine benutzerdefinierte Verbindung verwenden, was ich tue (eine Verbindung, die über mongoose.createConnection() anstelle von mongoose.connect() hergestellt wird), müssen Sie Modelle erstellen von der mit dieser Verbindung verknüpften Mungo-Instanz. Sonst funktioniert es überhaupt nicht, was viel schlimmer ist als eine lästige Warnung.

Ja, ich mache dasselbe wie @Spown. Es ist sicherlich nicht ideal, aber es ist die einzige Möglichkeit, Mongoose abwärtskompatibel zu halten, bis zur nächsten Hauptversion, wenn wir mpromise vollständig ablehnen können

libs/mongoose.js

import mongoose from 'mongoose'; // real mongoose only be required once here 

mongoose.Promise = global.Promise; // so that you dont have to do this on every require
const Schema = mongoose.Schema;

export {
  mongoose as default, // kind of singleton
  mongoose,
  Schema,
};

index.js

import mongoose from './libs/mongoose';
mongoose.connect(process.env.MONGODB_URI);

models/user.js

import {mongoose, Schema} from '../libs/mongoose';

export default mongoose.model('User', new Schema({
  name: String,
  password: String,
}));

@howard require()-Aufrufe werden zwischengespeichert.

Also, wenn ich das richtig verstehe, muss ich das Versprechen vor jeder Schema-Deklaration setzen, anstatt es nur an einer Stelle zu tun (z. B. in meiner Indexdatei oder wo ich die Verbindung einstelle).
Dies ist keine gute Praxis, es lohnt sich, es in eine Funktion zu ändern, etwa so:
mongoose.setPromise(global.Promise);

@sh-guti Ich denke schon, ich hatte das gleiche Problem und dieser Code löst das.

An dieser Stelle weiß ich nicht, ob ich Callbacks oder Promises verwenden soll. LOL.

Benutzen

mongoose.createConnection(URI)

Kann jemand erklären, warum in aller Welt Mongoose die Existenz nativer Promises leugnet und sie nicht sofort verwenden kann?

Abwärtskompatibilität. Mongoose 4.x gab es über ein Jahr lang, bevor Node 4 veröffentlicht wurde. Wir werden mit dem nächsten rückwärts brechenden Release umschalten.

Wann wird das sein?

mongoose.createConnection(URI) verursacht einen sehr seltsamen Fehler mit Mongoose , stundenlanges Debuggen mit nicht funktionierenden Abfragen . ging schließlich zurück zu

mongoose.connect (process.env.MONGODB); aus mongoose.createConnection (process.env.MONGODB)

Nebenbei bemerkt, es hat die Abschreibungswarnung gestoppt ... aber alles funktioniert nicht mehr ...

@MickL Wir werden in den nächsten Wochen einen rc0 herausbringen, folge Mongoose auf Twitter oder tritt dem Slack Channel bei, um Updates zu erhalten

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen