Mongoose: Peringatan Penghentian

Dibuat pada 1 Jul 2016  ·  79Komentar  ·  Sumber: Automattic/mongoose

Saya mendapatkan peringatan ini

(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

setelah saya lakukan

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

driver adalah turunan dari kelas Driver

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;
  }
}

setiap pemikiran tentang apa yang saya lakukan salah?

help

Komentar yang paling membantu

Saya memecahkan peringatan itu dengan melakukan

mongoose.Promise = global.Promise;

Tepat sebelum menelepon luwak.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;
};

Semua 79 komentar

Hmm apakah Anda menggunakan janji di mana saja? Anda seharusnya tidak mendapatkan peringatan ini kecuali jika Anda menggunakan janji...

tidak saya tidak menggunakan janji

Saya juga baru mulai mendapatkan masalah ini. Tidak menggunakan janji yang saya tahu!

Saya memecahkan peringatan itu dengan melakukan

mongoose.Promise = global.Promise;

Tepat sebelum menelepon luwak.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;
};

Ya, peringatan ini seharusnya memberi tahu Anda untuk mengubah lib janji default luwak jika Anda menggunakan janji, tetapi itu tidak akan terjadi kecuali Anda menelepon .then di suatu tempat

Saya mengerti tetapi saya hanya mendapatkannya di tempat saya menyimpan objek lalu memodifikasinya di panggilan balik dan menyimpannya lagi

Saya sudah mencoba pendekatan @SAudelOG untuk menetapkan janji ke luwak sebelum luwak terhubung tetapi saya masih menerima kesalahan ini

Saya menggunakan fungsi async es7, dan kode saya diblokir ketika saya mencoba Model.findOne({})

Solusi yang disediakan @SAudelOG berfungsi. Seperti @IrishAdo , saya hanya mendapatkan ini saat menyimpan objek juga. Mungkin karena salah satu plugin luwak yang saya gunakan menggunakan perpustakaan janji Bluebird.

Berikut adalah daftar dependensi yang saya gunakan

  "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"
  }

Saya tidak menggunakan plugin atau janji dan mendapatkan peringatan ini juga (di [email protected]).

Menjalankan aplikasi saya dengan "--trace-deprecation" saya punya:

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)

Saya memiliki masalah yang sama, jika ada bantuan, itu dipicu secara khusus ketika saya mencoba membuat dokumen yang memiliki larik subdokumen di dalamnya, seperti:

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

mySchema.create(data, cb)

Itu tidak terjadi dengan koleksi lain yang tidak memiliki subdoc, bahkan tidak terjadi jika saya mengeluarkan pernyataan create tanpa data subdoc, seperti ini:

var data = {
  field: 'value'
} 

mySchema.create(data, cb)

_Catatan:_ mongoose.Promise = global.Promise memang memecahkan masalah peringatan untuk saya

Mengalami peringatan penyusutan yang sama ketika saya menggunakan remove() pada dokumen. Saya tidak menggunakan janji di sini atau di mana pun dalam kode saya.

Saya baru saja mendapatkan kesalahan ini saat menggunakan Model.create(objects, callback); , mungkin perbaikan ini belum dipublikasikan ke npm?

Mendapatkan ini, senang membacanya tidak mengkhawatirkan. Saya akan melihat lebih dekat ke dalam ini untuk membantu debugging ketika itu terjadi.

Mendapatkan ini juga, dan saya tidak menggunakan janji luwak di mana pun.

Saya dapat melacaknya kembali ke panggilan model.save di dalam panggilan balik perpustakaan on-headers , dan model dibuat di luar panggilan balik, sebelum dipanggil, jika itu membantu siapa pun. Menempatkan pembuatan model dan menyimpan panggilan dalam panggilan balik tidak ada bedanya.

Menghadapi masalah ini pada simpul v4.4.6 sedangkan pada v4.4.2 ini tampaknya berhasil

Mohon contoh kode @SKatiyar

sama dengan saya, mendapatkan pesan ini setelah menggunakan metode save(), cukup bagi saya untuk peduli

Ini bekerja! Sebelum mongoose.connect(MONGO_URI); tambahkan mongoose.Promise = global.Promise;

Kode berikut cukup untuk direproduksi di pihak saya:

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'

Hal aneh yang dapat saya lihat di sini adalah bahwa menggunakan newModel.save(callback) masih mengembalikan janji (atau saya berasumsi itu adalah janji, karena jenis .then adalah 'function' ). Apakah itu perilaku yang diharapkan?

Berikut adalah versi saya:
Simpul: v6.3.1
Luwak: v4.5.8

Beri tahu saya jika Anda memerlukan info lain dari saya.

@dvlsg ya itulah perilaku yang diharapkan saat ini, simpan akan selalu mengembalikan janji bahkan jika Anda melewati panggilan balik

Yah, saya kira itu setidaknya akan menjelaskan mengapa orang melihat peringatan janji bahkan ketika mereka tidak berpikir mereka menggunakan janji.

Itu menjelaskan semuanya.. Aku hanya sedikit paranoid dan ingin menghilangkan semua peringatan itu

Ini salahku, yup .save() mengembalikan janji jadi ini diharapkan, tapi tetap saja, peringatan membuatku bertanya-tanya. http://mongoosejs.com/docs/promises.html (hanya harus membaca paragraf pertama )

Jadi .save() mengembalikan janji tetapi Anda seharusnya tidak mendapatkan peringatan ini kecuali Anda menelepon .then() . Jika Anda mendapatkan peringatan ini tanpa memanggil .then() dalam kode Anda, itu berarti luwak menggunakan janji di suatu tempat yang tidak seharusnya, jadi silakan buka masalah terpisah dengan contoh kode :+1:

IMHO, pesan ini seharusnya merupakan kesalahan ("sesuatu tidak berfungsi") daripada peringatan ("perhatikan tetapi harus berfungsi"), karena sebenarnya dikembalikan sebagai kesalahan dalam panggilan balik.

Saya mengalami masalah ini dan metode aModel.save() tidak berfungsi untuk dimasukkan ke dalam MongoDB. Butuh beberapa waktu untuk mencari akar penyebab masalah ini. Setelah menerapkan "mongoose.Promise = global.Promise;", berhasil.

Saya menggunakan "luwak": "^4.5.9".

Simpan harus berfungsi dengan baik dengan lib janji default, dapatkah Anda memberikan contoh kode?

@vkarpov15

Kamu benar. Saya baru saja mencoba dan gagal membuat ulang dari awal hasil penyimpanan pemblokiran dengan peringatan.

Saya tidak yakin apakah ini terkait dengan kode lain di proyek saya. perlu beberapa waktu untuk memeriksa. Mohon abaikan sebelum saya mengetahui penyebabnya.

Saya bagi saya log ini muncul di konsol setiap kali saya menggunakan .then(), tidak masalah jika digunakan dengan objek luwak atau objek lain yang tidak terkait dengan luwak

Jadi, sesuai dokumen , saya lewat

'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
};

Kemudian di file utama saya lakukan

'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);
});

Dan saya masih mendapatkan peringatan penghentian saat melakukan query.exec . Adakah saran tentang apa yang saya lakukan salah?
[Sunting: Menambahkan versi luwak dan burung biru]
Saya menggunakan luwak ^4.6.1 , bluebird ^3.4.6

Saya juga mendapat peringatan di luwak 4.6.1 dan node 4.4.5

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

@manu29d sepertinya Anda tidak menyetel mongoose.Promise = bluebird

@vkarpov15 saya pikir saya. Saya mendeklarasikan var Promise = di awal skrip konfigurasi dan kemudian promiseLibrary: Promise nanti. (Lihat cuplikan kode pertama dalam contoh)

Juga, saya mencoba menulis promiseLibrary: require('bluebird') seperti yang diberikan dalam dokumen.

Saya tidak melihat mongoose.Promise = require('bluebird') di mana pun dalam contoh kode yang Anda berikan. var Promise = require('bluebird'); _tidak_ benar.

@vkarpov15 Saya mengacu pada http://mongoosejs.com/docs/promises.html#promises -for-the-mongodb-driver

Apakah itu masih berlaku? Saya tidak punya waktu untuk memeriksa kode apakah opsi ini( promiseLibrary ) masih didukung dalam konfigurasi atau telah dihapus.

Pengaturan mongoose.Promise = global.Promise berfungsi.

mongoose.Promise = global.Promise
sebelum mongoose.connect bekerja untuk saya juga.

Saya tidak menggunakan janji dan menelepon mongoose.Promise = global.Promise sebelum koneksi berfungsi.

@manu29d dokumen itu benar, namun, jika Anda benar-benar membacanya, Anda akan melihat bahwa opsi promiseLibrary hanya memengaruhi driver mongodb yang mendasarinya, _not_ model luwak.

@zubair-farooqui-10p skrip di bawah ini tidak memicu peringatan untuk saya di 4.5.9 atau 4.6.3:

'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;

Sangat menjengkelkan Anda harus menambahkan baris tambahan ini, apakah ada cara bagi luwak untuk memperbaikinya di perpustakaan internal mereka? Terima kasih!

Tidak secara umum, karena cara kerja mekanisme pengalihan lib janji luwak sangat berbeda dari cara pengandar mongodb. Di luwak itu hanya properti yang dapat Anda atur pada objek global luwak kapan saja, sedangkan di driver mongodb itu adalah opsi koneksi, jadi koneksi yang berbeda dapat memiliki lib janji yang berbeda tetapi Anda hanya dapat mengatur lib janji saat Anda terhubung, tidak sesudahnya. Sebenarnya bukan prioritas untuk mendamaikan perbedaan-perbedaan ini.

Mengapa ini terjadi ketika menyimpan dokumen yang memiliki array string, adakah yang bisa menjelaskannya?

Saya juga mendapatkannya setelah menelepon .createConnecton() . Lucunya saya menggunakan Q... TAPI! Tetapi saya lebih suka melakukannya setelah saya membuat koneksi, karena saya (dan saya cukup yakin semua orang) lebih suka melakukannya di blok deklarasi var. yaitu

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

Sebagai gantinya, untuk menghilangkan peringatan ini saya terpaksa melakukan:

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

Bukan masalah besar, tapi srsly...

Ya begitulah caranya. Mongoose 4.x akan menggunakan mpromise sampai Anda melarangnya.

Saya melihat ini ketika menggunakan panggilan find() biasa dengan pembantu kueri. Saya tidak menggunakan then di mana pun.

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

Catatan:

Luwak: toko buku.find({ lokasi: { '$near': [ 28.742712943610545, -13.865369983731426 ], '$maxDistance': 0.0012556898446083817 } }, { batas: 10, bidang: tidak ditentukan })

(node:82366) DeprecationWarning: Mongoose: mpromise (perpustakaan janji default luwak) sudah usang, colokkan perpustakaan janji Anda sendiri sebagai gantinya: http://mongoosejs.com/docs/promises.html

@pronebird sayangnya begitulah exec() bekerja secara internal, panggilan balik ke exec() benar-benar memenuhi janji. Lakukan saja mongoose.Promise = global.Promise dan Anda seharusnya tidak mendapatkan peringatan itu lagi.

@pronebird Saya mendapatkan kesalahan yang sama saat memposting, dan saya menemukan bahwa skema saya memiliki nilai default seperti yang ditunjukkan di bawah ini dan tidak cocok dengan nilai yang saya posting di bawah ini
peran: {
jenis: Tali,
enum: ['Klien', 'Admin'],
default: 'Klien'
}
Saya memposting peran: admin dan itu harus Admin
semoga jawaban ini membantu seseorang. Terima kasih

@Muhammedalbayati Saya rasa masalah Anda tidak ada hubungannya dengan masalah khusus ini? Itu hanya peringatan yang dikeluarkan oleh Luwak tentang janji.

@varunjayaraman Anda benar, saya harus menyebutkan yang berikut ini
peringatan
DeprecationWarning: Mongoose: mpromise (perpustakaan janji default luwak) sudah usang, colokkan perpustakaan janji Anda sendiri sebagai gantinya: http://mongoosejs.com/docs/promises.html

hilang dengan menambahkan luwak.Janji = global.Janji; sebelum menghubungkan ke db
luwak.connect('mongodb://localhost:27017/mydb');

@Muhammedalbayati Saya pikir @vkarpov15 menjelaskan mengapa peringatan ini muncul. Luwak menggunakan janji secara internal dalam exec .

ES6 "mengalahkan" tidak berfungsi dengan metode doc.save setelah saya memutakhirkan luwak ke v.4.7.7.
Akhirnya hanya karena mongoose.Promise = global.Promise . Setelah saya menghapus ini masih peringatan

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

Saya kira [email protected] memiliki modul janjinya sendiri. Apakah itu benar??
Apakah ada yang mengetahuinya?

Ini adalah luwak menambahkan lib es6-promise.

Masalah yang sangat bodoh!

PS: Dorong peringatan sialan itu ke vaginamu!

sebagai sesama penutur bahasa Rusia, saya minta maaf atas perilaku makhluk yang lebih rendah ini yang menunjukkan dorongan agar Anda tidak menerjemahkan apa yang tertulis di sini.

@vkarpov15 Saya telah mencoba keduanya mongoose.Promise = global.Promise; dan mongoose.Promise = require('bluebird'); .

Sayangnya, saya masih menerima peringatan penghentian.

_Apakah ada sesuatu yang saya lakukan salah?_

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 Apakah Anda mengimpor luwak di tempat lain di aplikasi Anda? Apakah ini pertama kalinya luwak digunakan atau apakah file ini diimpor ke file lain?

Juga versi luwak /node apa yang Anda gunakan?

@varunjayaraman File ini tidak diimpor ke tempat lain. Namun, saya mengimpor luwak di file skema user.js saya dan kemudian menggunakan skema Pengguna itu di beberapa pengujian saya.

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

simpul v7.0.0luwak v4.8.1

@protoEvangelium apakah Anda mendapatkan peringatan di aplikasi Anda atau hanya di pengujian Anda?

Saya pernah mengalami masalah yang sama - pelakunya adalah modul lain, yang menggunakan ketergantungan luwaknya sendiri. Modul tersebut memiliki sesuatu seperti "mongoose": "^4.1.1" dalam package.json mereka, tetapi karena modul ini diperbarui setiap tahun (jika ada) - mereka tidak memiliki bagian config janji. @protoEvangelium apakah Anda menggunakan modul lain?

@SAudelOG Terima kasih atas jawabannya

@varunjayaraman Saya baru mulai menguji penambahan pengguna ke Mongo menggunakan Mongoose dan Mocha. Ini adalah proyek barebone sejauh ini.

@Spown saya menggunakan:
"mocha": "^3.2.0", "mongoose": "^4.8.1", "nodemon": "^1.11.0"

Terima kasih :)

@protoEvangelium tunggu sebentar, apakah Anda mencoba ini?

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

jika Anda membuat model dari instance luwak yang janjinya tidak didefinisikan ulang - setiap kueri pada model ini akan memberikan peringatan.

@Spown

Saya terjadi di utas ini pada waktu yang tepat. Saya menerima peringatan yang sama setiap kali saya menyimpan informasi. Ternyata saya membuat model dari instance luwak dan tidak mendefinisikan ulang. Membutuhkan bluebird dan mengaturnya ke luwak. Janji menyelesaikan pesan kesalahan.

Terima kasih banyak!

@Spown Terima kasih pak! Itulah masalahnya. Menariknya, saya mendefinisikan mongoose.Promise = global.Promise; di file test_helper.js saya tepat sebelum menghubungkan ke Mongoose. Saya mengalihkan mongoose.Promise = global.Promise; ke file saya tempat saya mendefinisikan Skema dan berfungsi!!!! Tidak ada lagi peringatan penghentian 👍

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

Saya mendapatkan masalah ini saat menggunakan virtual "populasi" di skema saya. Menjalankan aplikasi saya dengan --trace-deprecations , Anda dapat melihat pelakunya:

(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)

Saya telah menetapkan janji (perhatikan saya menggunakan TypeScript):

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

Ada ide? Haruskah saya menetapkan janji pada setiap model yang menggunakan virtual "dapat dihuni"? Tunggu, saya benar-benar akan mencobanya dan kembali seperti semula.

Oke, setelah beberapa mengutak-atik, saya menemukan bahwa saya masih perlu mengatur Promise pada Skema saya bahkan jika saya telah mengaturnya di index dari server saya.

Dalam kasus saya, koleksi website_pages adalah koleksi pertama yang pernah ditanyai oleh sistem saya, menyetel mongoose.Promise ke global.Promise pada skema ini saja telah memperbaiki masalah dan saya tidak 't diperlukan untuk mengaturnya di semua Skema.

Mengapa tidak menggunakan Janji ES6? Bukankah mereka tersedia di mana-mana sekarang?

mongoose.Promise = Promise; // eh?

Terima kasih @Spown , saya menghadapi peringatan penghentian yang sama sejak saya memasukkan mongoose.Promise = global.Promise setelah mengimpor model. Sekarang peringatan penghentian itu hilang.

Mendeklarasikan mongoose.Promise = global.Promise dalam file model seperti yang disebutkan oleh @Spown berfungsi. Ini karena cache node dari modul yang diperlukan . Ini tampaknya berubah-ubah sekalipun. Apakah tidak ada cara untuk memastikan bahwa test_helpers.js dimuat terlebih dahulu sehingga saya dapat mengatur fungsi janji luwak dalam file ini?

Apakah tidak ada cara untuk memastikan bahwa...

secara pribadi saya require luwak hanya sekali dalam proyek saya, kemudian saya memasukkannya ke dalam objek Singleton global dan menggunakannya di mana-mana untuk semua tujuan DB. Tidak terlalu anggun, tapi kebanyakan antipeluru. dan saya telah melakukannya jauh sebelum penghentian hanya karena jika Anda menggunakan koneksi khusus, yang saya lakukan (koneksi dibuat melalui mongoose.createConnection() alih-alih mongoose.connect() ) - Anda harus membuat model dari instance luwak yang ditautkan ke koneksi ini. Kalau tidak, itu tidak akan berfungsi sama sekali yang jauh lebih buruk daripada beberapa peringatan sial.

ya saya melakukan hal yang sama seperti @Spown. Ini tentu saja tidak ideal, tetapi itu satu-satunya cara untuk menjaga agar luwak tetap kompatibel hingga rilis besar berikutnya ketika kami dapat sepenuhnya menghentikan mpromise

libs/luwak.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);

model/pengguna.js

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

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

@howward require() panggilan di-cache.

Jadi, jika saya mengerti dengan benar, saya perlu menetapkan janji sebelum setiap deklarasi skema alih-alih melakukannya hanya di satu tempat (misalnya di file indeks saya atau di mana saya mengatur koneksi)
Ini bukan praktik yang baik, patut dipertimbangkan untuk mengubahnya menjadi fungsi, seperti:
mongoose.setPromise(global.Promise);

@sh-guti saya pikir begitu, saya memiliki masalah yang sama dan potongan kode itu menyelesaikannya.

Pada titik ini saya tidak tahu, apakah harus menggunakan panggilan balik atau janji. TERTAWA TERBAHAK-BAHAK.

Menggunakan

mongoose.createConnection(URI)

Adakah yang bisa menjelaskan, mengapa luwak menyangkal keberadaan Janji asli dan tidak dapat menggunakannya di luar kotak?

Kompatibilitas mundur. Mongoose 4.x ada selama lebih dari setahun sebelum node 4 dirilis. Kami akan beralih dengan rilis melanggar mundur berikutnya.

Kapan ini?

mongoose.createConnection(URI) menyebabkan bug yang sangat aneh dengan Mongoose , berjam-jam debugging dengan kueri tidak berfungsi. akhirnya kembali ke

luwak.koneksi(proses.env.MONGODB); dari luwak.createConnection(process.env.MONGODB)

sebagai catatan tambahan, itu menghentikan peringatan penyusutan .. tetapi menghentikan semuanya bekerja ...

@MickL kami akan memiliki rc0 dalam beberapa minggu ke depan, ikuti luwak di twitter atau bergabung dengan saluran kendur untuk pembaruan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat