Mongoose: DeprecationWarning: Mongoose: mpromise (library promise default mongoose) tidak digunakan lagi dengan 4.8.0 dan 4.8.1

Dibuat pada 2 Feb 2017  ·  37Komentar  ·  Sumber: Automattic/mongoose

Dengan versi luwak 4.8.0 dan 4.8.1 (versi node 6.9.5 dan versi MongoDB adalah 3.2.11) peringatan berikut dibuat saat pertama kali penyimpanan dokumen terjadi setelah memulai aplikasi (peringatan tidak muncul saat kode yang sama dijalankan beberapa kali setelah pertama kali saat aplikasi masih berjalan, namun, jika aplikasi ditutup dan dimulai ulang, maka pertama kali penyimpanan dokumen terjadi setelah aplikasi dimulai, peringatan akan dibuat):

DeprecationWarning: Mongoose: mpromise (library promise default mongoose) tidak digunakan lagi, colokkan library promise Anda sendiri sebagai gantinya: http://mongoosejs.com/docs/promises.html

Masalah ini tidak muncul saat menggunakan kode aplikasi yang sama persis dengan versi luwak 4.7.9 dan sebelumnya.

Kode yang mengatur koneksi luwak adalah sebagai berikut:

`// Set up mongoose and DB connection
 var mongoose = require('mongoose');
 mongoose.Promise = require('bluebird');
 mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});`
help wanted needs clarification

Komentar yang paling membantu

Cara Memperbaiki Peringatan Penghentian:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
var schema = new mongoose.Schema({
 // definition
}, {
 // options
});

module.exports = mongoose.model('foobar', schema);

Semua 37 komentar

Bisakah Anda menempelkan kode yang benar-benar menghasilkan kesalahan? Kode itu tidak akan bisa karena Anda belum menggunakan promise (kecuali Anda mengatakan bahwa cuplikan koneksi yang Anda posting menghasilkan peringatan?)

Tidak ada potongan koneksi yang tidak menghasilkan peringatan. Potongan penyimpanan pengguna baru berikut ini adalah kode yang menghasilkan peringatan, tetapi hanya pertama kali kode dijalankan setelah aplikasi dimulai (sekali lagi, peringatan tidak terjadi di luwak versi 4.7.9 dan yang lebih lama):

 `                       var curDate = new Date();

                         var newuser = new user(
                         {                             
                                "userName": userName,
                                "hashed_password": hashed_password,
                                "emailReg": false,
                                "email": "~",
                                "firstName": "",
                                "lastName": "",
                                "address.streetAddress": "",
                                "address.city": "",
                                "address.state": "",
                                "address.postalCode": "",
                                "phoneNumbers": [],
                                "accessLevel": 2,
                                "active": true,
                                "trialStartDate": curDate,
                                "maxStorageByteLimit": constants.maxStorageBytesPerUser,
                                "signUpDate": curDate,
                                "passwordResetDate": curDate,
                                "salt": temp,
                                "storageBytesUsed": 0
                            });

                        if (phoneNumberValid != false)
                        {
                            newuser.phoneNumbers.push({
                                "type": "mobile",
                                "number": contactPhoneNumber,
                                "primary": true
                            });
                        }

                        wlogger.crit("Create new user by UserName: " + userName);

                        newuser.save(function (err)
                        {
                            if (err)
                            {
                                wlogger.error(err + " - when saving user "
                                    + " creation by UserName: " + userName);
                                callback({
                                    "response": false,
                                    "res": "User creation failed. "
                                    + " Please try again or contact us at [email protected]"
                                });
                            }
                            else
                            {
                                wlogger.crit("Saved new user info for UserName: "
                                    + userName);

                                return callback({
                                        "response": true,
                                        "res": "Created user by User Name " + userName,
                                        "user_id": newuser._id,
                                        "last_modified_date": curDate
                                });
                            }
                        })`

Skema pengguna adalah sebagai berikut:

`var userSchema = mongoose.Schema({ 
token : String,
email: String,
userName: String,
deviceId: String,
devicePhoneNumber: String, 
hashed_password: String, 
hashed_admin_code: String,
maxStorageByteLimit: { type: Number, default: 1073741824 },
accessLevel: { type: Number, default: 2 },
lastAccessType: Number,
storageBytesUsed: { type: Number, default: 0 },
totalStorageBytesUsed: { type: Number, default: 0 },
deletedStorageBytesUsed: { type: Number, default: 0 },
salt : String,
salt1 : String,
temp_str: String,
syncInProcess: { type: Boolean, default: false },
syncStartDate: { type: Date, default: Date.now },
syncVersion : { type: Number, default: 0 },
active: { type: Boolean, default: false },
disabled: { type: Boolean, default: false },
emailReg: { type: Boolean, default: false },
regPending: { type: Boolean, default: false },
emailChangePending: { type: Boolean, default: false },
regCodeSendCount: { type: Number, default: 0 },
trialStartDate: Date,
signUpDate: Date,
passwordResetDate: Date,
lastLoginDate: Date,
lastModifiedDate: Date,
curLoginDate: Date,
apnDeviceTokens: [ String ],
curSessionIds: [ String ],
curIpAddr: { ipType: String, 
    upper64: Schema.Types.Long,
    lower64: Schema.Types.Long },
firstName: String,
lastName: String,
address: { streetAddress: String,
    city: String,
    state: String, postalCode: String },
phoneNumbers: [ phoneNumbersSchema ],
categories: [ categoriesSchema ],
providerCustomers: [ customerSchema ],
serviceProviders: [ providerSchema ],
ipAddrs: [ ipAddrSchema ],
recentUploads: [ recentUploadSchema ],
recentUploadsGizmo: [ recentUploadSchema ],
recentUploadsLife: [ recentUploadSchema ],
recentUploadsVehicle: [ recentUploadSchema ],
recentUploadsMisc: [ recentUploadSchema ],
recentViews: [ recentViewsSchema ],
recentAdds: [ recentAddsSchema ],
recentAddedFiles: [ recentAddedFilesSchema ],
locations: [ locationSchema ],
inMessages: [ inMessageSchema],
outMessages: [ outMessageSchema ]
  });`

Saya dapat mengonfirmasi masalah yang sama dengan mongoose v4.8.1 & node.js v7.5.0.

mongoose.Promise = global.Promise;
mongoose.connect(db.mongodb.uri, db.mongodb.options);
DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

@ stevenelson74708 terima kasih atas cuplikannya, tetapi skemanya sendiri mungkin bukan masalahnya. Apa yang saya cari lebih lanjut adalah bagaimana skema diimpor dan digunakan relatif terhadap saat koneksi dibuka / konstruktor Janji luwak disetel.

Skema diekspor dari file skema yang dideklarasikan sebagai berikut:

`module.exports = mongoose.model('users', userSchema);   `

dan skema diimpor ke dalam file yang digunakan di mana newuser.save dipanggil sebagai berikut:

`var user = require('config/models/users');`

Cuplikan koneksi (di mana koneksi terbuka dan konstruktor Janji luwak diatur) yang ditampilkan di posting pertama saya terjadi di file app.js yang berjalan saat inisialisasi selama startup aplikasi.

Potongan newuser.save yang ditampilkan di posting kedua saya dieksekusi dari file tempat skema pengguna diimpor dan newuser.save dieksekusi ketika pengguna berinteraksi dengan aplikasi dan menyebabkan rute tertentu dieksekusi, yang baik setelah inisialisasi aplikasi telah selesai.

Peringatan terjadi hanya saat pertama kali kode newuser.save dijalankan setelah aplikasi dimulai meskipun kode newuser.save yang sama dijalankan berkali-kali setelah startup, dan peringatan tersebut tampaknya tidak terjadi dengan luwak versi 4.7.9 dan yang lebih lama.

@ stevenelson74708 saya perlu melihat semua komponen yang berperan dalam startup aplikasi Anda. Banyak orang telah membuka masalah baru-baru ini tentang hal ini, dan setiap masalah berasal dari pengaturan konstruktor janji yang tidak tepat, jadi tebakan saya adalah Anda melakukan sesuatu yang salah dalam urutan yang Anda setel mongoose.Promise .

Adakah cara agar saya dapat melihat kode Anda?

Di bawah ini adalah semua kode (dalam urutan yang tepat) di inisialisasi app.js yang terkait dengan konfigurasi luwak, termasuk pengaturan mongoose.Promise. Peringatan tidak terjadi saat kode inisialisasi dijalankan. Peringatan ini hanya muncul pertama kali kode newuser.save (tunjukkan di posting saya sebelumnya) dijalankan setelah aplikasi diinisialisasi. Ada panggilan findOneAndUpdate yang dijalankan sebelum penyimpanan yang tidak menyebabkan peringatan, sehingga tampaknya hanya fungsi simpan yang menyebabkan peringatan.

Konfigurasi luwak adalah salah satu hal pertama yang terjadi dalam inisialisasi. Haruskah konfigurasi luwak terjadi nanti dalam inisialisasi seperti setelah fungsi createServer?

Sekali lagi, peringatan tersebut tampaknya tidak muncul di luwak versi 4.7.9 dan sebelumnya:

`// Set up mongoose and DB connection
var mongoose = require('mongoose');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});
var conn = mongoose.connection;

conn.once('open', function ()
{
    wlogger.info("Mongoose connection opened on process " + process.pid);
});`

Tidak, konfigurasi bisa didahulukan. Apakah file ini titik masuk untuk aplikasi Anda atau ada file yang mendahuluinya?

File app.js adalah titik masuk untuk aplikasi. Aplikasi dapat dipanggil dengan mengetik node app.js di baris perintah.

Saya memiliki masalah yang sama dengan luwak 4.8.1 dan node 7.5.0. Saya juga menggunakan Typecript dan mencoba mencolokkan Bluebird untuk janji. Saya menemukan bahwa peringatan menghilang jika saya menambahkan kode ini:

`import * as mongoose from 'mongoose';
 import * as bluebird from 'bluebird';

 (<any>mongoose).Promise = bluebird;`

di SETIAP file yang mengimpor sesuatu dari 'luwak'. Jadi saya perlu melakukan itu di setiap file model (file tempat saya mendefinisikan skema saya), bukan hanya di file titik masuk.

// Set up mongoose and DB connection
var mongoose = require('mongoose');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});
var conn = mongoose.connection;

conn.once('open', function ()
{
    console.log('test');
});

Tidak mencetak peringatan ini, jadi ada hal lain.

@vladimirdjurdjevic ini berarti bahwa di suatu tempat Anda menggunakan operasi asinkron luwak sebelum menyetel lib promise. Saya tidak menggunakan TS jadi saya tidak tahu apakah itu ada hubungannya dengan itu.

Saya menetapkan lib promise seperti yang ditunjukkan di atas di file app.js yang merupakan titik masuk aplikasi, dan kemudian saat newuser.save pertama dilakukan (lama setelah lib promise disetel) seperti yang ditunjukkan di atas, peringatan akan terjadi. Newuser.save adalah operasi asinkron mongoose pertama yang terjadi, tetapi ini terjadi dengan baik setelah promise adalah lib disetel untuk koneksi.

Apakah lib promise harus disetel di setiap file yang mengakses fungsi async luwak sebagai lawan dari menyetel lib promise hanya sekali ketika koneksi mongoose dikonfigurasi?

@ stevenelson74708 Saya memiliki masalah yang sama. Saya pikir saya menyelesaikannya dengan: mongoose.Promise = global.Promise di titik masuk aplikasi. Sepertinya Anda memang membutuhkannya di setiap file yang mengakses janji luwak. Sangat mengganggu. Cukup atur konfigurasi luwak dalam file terpisah, ekspor dan impor dimanapun diperlukan.

Saya juga baru-baru ini menyadari bahwa saya mendapatkan peringatan ini, meskipun saya telah menetapkan janji di file app.js saya. Saya sudah mencoba menggunakan native dan bluebird dengan hasil yang sama.

// FILE: app.js
import bluebird from 'bluebird';
import mongoose from 'mongoose';

// use bluebird as default promise library
mongoose.Promise = bluebird;

Saya mengimpor luwak ke beberapa model saya dan menggunakannya dalam metode skema. Saya telah memecahkan masalah dengan mengatur pustaka janji di file yang pernah mengimpor luwak sendiri (lihat TODO di cuplikan di bawah). Saya tidak ingat melihat peringatan beberapa bulan yang lalu karena struktur kode yang serupa.

// FILE: SessionModel.js
import bluebird from 'bluebird';
import mongoose from 'mongoose';

// TODO: remove this redundant bit of code
// use bluebird as default promise library
mongoose.Promise = bluebird;

SessionSchema.methods.getUser = function(callback) {
  return mongoose.model('User').findById(this.user, callback);
};

@mcfarljw Anda lebih baik melakukan sesuatu seperti ini:

// config.js
const bluebird = require('bluebird');
const mongoose = require('mongoose');
mongoose.Promise = bluebird;
mongoose.connect('mongodb://localhost:27017/myApp)
module.exports = { mongoose }
// SessionModel.js
const { mongoose } = require('./config')

SessionSchema.methods.getUser = function(callback) {
  return mongoose.model('User').findById(this.user, callback);
};

Dengan begitu Anda tidak perlu menulis "mongoose.Promise = bluebird" berkali-kali :)

Dalam situasi saya, saya mendapatkan peringatan penghentian saat bertindak pada sub-dokumen menggunakan sintaks .then() , tetapi tidak pada dokumen induk. Jadi peringatan sesekali membuat saya berpikir saya memiliki masalah sintaks dengan menangani dokumen anak-anak, tetapi sebenarnya itu adalah kurangnya baris janji dalam file model seperti yang disarankan orang lain di atas.

Ya, tampaknya pengaturan mongoose.Promise di file skema tempat mongoose.model diekspor menghilangkan peringatan di mongoose versi 4.8 dan yang lebih baru.

Ya, menyebarkan luwak tunggal sebagai ekspor bermutasi Anda sendiri akan mengatasi masalah ini, tetapi memang diakui sedikit peretasan.

Pada titik ini, tidak jelas bagi saya seperti apa pengaturan / konfigurasi luwak yang "tepat" untuk menghindari peringatan tersebut. Apakah peringatan ini merupakan masalah dengan versi luwak saat ini atau apakah ini merupakan indikasi dari penyiapan luwak yang tidak tepat? Apakah ada pengaturan luwak yang direkomendasikan untuk mencegah peringatan tersebut? Sekali lagi, peringatan ini hanya mulai terjadi dengan luwak versi 4.8.0.

Saya memiliki masalah yang sama tentang pengaturan luwak global.

Saya telah menelusuri ke bawah, itu dapat mengatur bluebird dengan benar ke promise_provider tetapi ketika saya mencoba mendapatkan kembali janji, itu akan mengembalikan ES6.

Saya baru saja melalui dan menambahkan

mongoose.Promise = global.Promise

segera setelah memerlukan / mengimpor luwak di setiap file sumber yang menggunakannya, dan meskipun itu berlebihan, hanya butuh sedikit pemikiran dan tidak banyak waktu untuk melakukannya, dan itu benar-benar memperbaikinya. Jadi, bukan transaksi terbesar.

Itu memang menantang pengetahuan saya yang memang terbatas tentang bagaimana membutuhkan dan mengimpor bekerja. Saya mendapat kesan bahwa tidak peduli berapa kali Anda membutuhkan sesuatu, Anda selalu mendapatkan contoh yang sama, jadi menetapkan janji sekali saja sudah cukup, Anda akan berpikir. Jadi ini agak kontra-intuitif.

Hai
Saya punya beberapa contoh kode yang menyebabkan masalah

import mongoose from 'mongoose';

mongoose.Promise = Promise;

import Test from './test.model';

mongoose.connect(uri, options);
mongoose.connection.on('error', err => console.error(`MongoDB connection error: ${err}`));

Test.create({ name: 'Hi'})
  .then(() => Test.findOne({}))
  .then(res => res.save())
  .then(() => console.log('Done'));

(test.model hanyalah model sederhana dengan satu bidang untuk nama)

Untuk beberapa alasan masalah pertama kali muncul saat melakukan res.save(); . Tanpanya semuanya berjalan seperti biasa.

Saya percaya bahwa masalah ini berasal dari babel yang mengubah urutan saat mentranspilasi kode. Ketika babel ditranspilasi, ia memindahkan semua impor ke atas. Jadi, ketika test.model diimpor dalam contoh saya, perpustakaan Promise masih ditugaskan ke mpromise.

Saya menggunakan Node.js 6.10.0 dan Mongoose 4.8.5 dan saya mendapatkan masalah ini.

Saya menyimpan objek pengguna saya:

var newUser = User({
    login       : 'john',
    password    : 'secret',
    firstname   : 'John',
    lastname    : 'Doe',
    avatar      : 'avatar.png'
});

newUser.save(function(err){
    if(err) throw err;

    console.log('User created !');
});

Dan saya memiliki kesalahan yang sama. Saya mencoba cara ini:

mongoose.Promise = require('bluebird');
mongoose.connect(conf.dbpath);

Dan begini:

mongoose.Promise = global.Promise;
mongoose.connect(conf.dbpath);

Tapi saya sekali lagi memiliki peringatan yang tidak berlaku lagi. Bagaimana cara memperbaikinya?

Cara Memperbaiki Peringatan Penghentian:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
var schema = new mongoose.Schema({
 // definition
}, {
 // options
});

module.exports = mongoose.model('foobar', schema);

Ya itu berhasil jika saya memasukkan ini ke dalam model saya. Jadi kita harus memulai janji luwak di dalam setiap model.

Saya pikir @ stevenelson74708 memiliki poin yang sangat baik ketika mengatakan At this point it's unclear to me as to exactly what the "proper" mongoose setup/configuration to avoid the warning is.

Ya, perbaikannya adalah kembali ke semua file model luwak dan menambahkan mongoose.Promise = global.Promise setelah impor, tetapi karena masalah ini baru saja muncul baru-baru ini, alangkah baiknya untuk mendapatkan jawaban yang lebih konkret mengenai niatnya. atau penyebab di baliknya. Saya tidak yakin pada titik ini apakah itu masalah yang disebabkan oleh luwak, babel atau kombinasi keduanya.

Kemungkinan penipuan # 5030. Coba tingkatkan ke> = 4.9.1.

Sebagai catatan, solusi @bricss bekerja dengan cukup baik untuk saya :)

Pertama, solusinya berasal dari @ steve-p-com. Bukan dari @bricss.
@ vkarpov15 peringatan yang sama dengan 4.9.3.
@stillesjo tidak apa-apa dengan babel. Peringatan tersebut muncul juga pada nativ tanpa Babel pada Node 7.8.0.

Saya tidak memiliki peringatan apa pun sejak versi 4.9.3 🌷

Bahkan ketika kami menetapkan mongoose.Promise = global.Promise; pada setiap model, saya pikir itu bukan perbaikan _ideal_ kan? Mengapa tidak menggunakan global.Promise sebagai default dan membiarkan pengguna mengubahnya jika mereka mau?

Unit menguji model saya. Saya harus memasukkannya agar kami tidak melihat peringatan saat menjalankan pengujian secara lokal atau di CI.
Saya menggunakan "mongoose": "4.10.4" dengan simpul v7.10.0

@distroartonline

Hanya untuk menambahkan solusi KERING ini, atur di mana Anda menginisialisasi koneksi dengan database alih-alih mengatur di dalam setiap model.

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://...');

sepertinya berhasil

Itu tidak selalu berhasil untuk semua orang. Itu tergantung pada struktur kode Anda. Jika misalnya file dengan kode koneksi memerlukan model dari file sumber terpisah, cara memerlukan pekerjaan berarti file sumber tersebut akan dimuat sebelum janji global telah ditetapkan dalam file yang berisi kode koneksi. Model tersebut akan terus menggunakan nilai default untuk promise tersebut. Rute yang aman hanyalah dengan menetapkan janji global di setiap file sumber yang membutuhkan luwak.

ini berhasil untuk saya
`` ''
impor luwak dari 'luwak';
impor konfigurasi dari './config';
impor bluebird dari 'bluebird';

ekspor panggilan balik default => {
luwak.Promise = bluebird;
// sambungkan ke database dari instance database di file konfigurasi
biarkan db = mongoose.connect (config.mongoUrl, {useMongoClient: true});
panggilan balik (db);
}
`` ''

Begitulah cara saya melakukannya.

var colors = require('colors');
var mongo = require('mongodb');
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

var db = mongoose.connection;

mongoose.connect('mongodb://localhost:27017/db', { useMongoClient: true })
.then(function(){
  console.log(" Connected to dbName ".green);

}).catch(err => console.error(err));

Anda harus menggunakan fungsi .create yang dilengkapi dengan luwak daripada .save,
Saya mengubah milik saya dan itu memperbaiki masalah

Saya di 4.13.9 dan ini masih ada. @ Gilbert136 solusi memperbaiki ini, menurut saya aneh sekalipun. .create calls .save, jadi kenapa tidak ada peringatan deprecation?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat