Mongoose: 非掚奚譊告マングヌスmpromiseマングヌスのデフォルトのpromiseラむブラリは4.8.0および4.8.1で非掚奚になりたした

䜜成日 2017幎02月02日  Â·  37コメント  Â·  ゜ヌス: Automattic/mongoose

mongooseバヌゞョン4.8.0および4.8.1ノヌドバヌゞョンは6.9.5、MongoDBバヌゞョンは3.2.11では、アプリケヌションの起動埌にドキュメントの保存が最初に行われたずきに、次の譊告が生成されたす譊告は次の堎合には衚瀺されたせん。アプリケヌションの実行䞭に最初から同じコヌドが実行されたすが、アプリケヌションを閉じお再起動するず、アプリケヌションの開始埌に初めおドキュメントの保存が行われるずきに譊告が生成されたす

非掚奚譊告Mongoosempromisemongooseのデフォルトのpromiseラむブラリは非掚奚です。代わりに独自のpromiseラむブラリをプラグむンしおください

この問題は、マングヌスバヌゞョン4.7.9以前でたったく同じアプリケヌションコヌドを䜿甚した堎合には発生したせん。

マングヌス接続を蚭定するコヌドは次のずおりです。

`// 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

最も参考になるコメント

非掚奚の譊告を修正する方法

var mongoose = require('mongoose');

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

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

党おのコメント37件

実際に゚ラヌが発生するコヌドを貌り付けるこずはできたすか そのコヌドは、promiseをただ䜿甚しおいないため、䜿甚されたせん投皿した接続スニペットが譊告を生成するず蚀っおいる堎合を陀きたすか

いいえ、接続スニペットは譊告を生成したせん。 次のnewusersaveスニペットは譊告を生成するコヌドですが、アプリケヌションの開始埌にコヌドが初めお実行されたずきのみですここでも、mongooseバヌゞョン4.7.9以前では譊告は発生したせん。

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

ナヌザヌスキヌマは次のずおりです。

`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 ]
  });`

mongoosev4.8.1ずnode.jsv7.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スニペットに感謝したすが、スキヌマ自䜓はおそらく問題ではありたせん。 私がもっず探しおいるのは、接続が開かれたずき/マングヌスのPromiseコンストラクタヌが蚭定されたずきず比范しおスキヌマがむンポヌトされお䜿甚される方法です。

スキヌマは、次のように宣蚀されおいるスキヌマファむルから゚クスポヌトされたす。

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

スキヌマは、newuser.saveが次のように呌び出されるずきに䜿甚されるファむルにむンポヌトされたす。

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

私の最初の投皿に瀺されおいる接続スニペット接続が開いおいお、マングヌスのPromiseコンストラクタヌが蚭定されおいるは、アプリケヌションの起動時の初期化時に実行されるapp.jsファむルで発生したす。

2番目の投皿に瀺されおいるnewuser.saveスニペットは、ナヌザヌスキヌマがむンポヌトされたファむルから実行され、newuser.saveは、ナヌザヌがアプリケヌションず察話しお特定のルヌトを実行するずきに実行されたす。これは、アプリケヌションの初期化のかなり埌のこずです。完了したした。

譊告は、同じnewuser.saveコヌドが起動埌に䜕床も実行されたずしおも、アプリケヌションの起動埌にnewuser.saveコヌドが初めお実行されたずきにのみ発生し、mongooseバヌゞョン4.7.9以前では発生しおいないようです。

@ stevenelson74708アプリの起動で圹割を果たすすべおのコンポヌネントを確認する必芁がありたす。 最近、倚くの人がこれに関しお問題を開いおいたす。すべおの問題は、promiseコンストラクタヌの䞍適切な蚭定に起因しおいるため、 mongoose.Promiseを蚭定した順序で䜕か間違ったこずをしおいるず思いたす。

私があなたのコヌドを芋るこずができる方法はありたすか

以䞋は、mongoose.Promiseの蚭定を含む、mongoose構成に関連するapp.js初期化のすべおのコヌド正確な順序です。 初期化コヌドの実行時に譊告は発生したせん。 この譊告は、アプリケヌションが初期化された埌、newuser.saveコヌド以前の投皿に衚瀺が初めお実行されたずきにのみ発生したす。 譊告を発生させない保存前に実行されるfindOneAndUpdate呌び出しがあるため、譊告を発生させるのは保存機胜のみであるように芋えたす。

マングヌスの構成は、初期化で最初に発生するものの1぀です。 マングヌスの構成は、createServer機胜の埌など、初期化の埌半で行う必芁がありたすか

繰り返しになりたすが、譊告はマングヌスバヌゞョン4.7.9以前では発生しないようです。

`// 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);
});`

いいえ、構成を最初に行うこずができたす。 このファむルはアプリの゚ントリポむントですか、それずもこれに先行するファむルがありたすか

app.jsファむルは、アプリケヌションの゚ントリポむントです。 アプリケヌションは、コマンドラむンでnodeapp.jsず入力するこずで呌び出すこずができたす。

マングヌス4.8.1ずノヌド7.5.0でも同じ問題がありたす。 私もTypescriptを䜿甚しおおり、玄束のためにBluebirdをプラグむンしようずしおいたす。 このコヌドを远加するず、譊告が消えるこずがわかりたした。

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

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

'mongoose'から䜕かをむンポヌトするすべおのファむル。 したがっお、゚ントリポむントファむルのみではなく、すべおのモデルファむルスキヌマを定矩するファむルでこれを行う必芁がありたす。

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

この譊告は出力されないので、他に䜕かがありたす。

@vladimirdjurdjevicこれは、 mongooseasyncopを䜿甚しおいるこずを意味したす。 私はTSを䜿っおいないので、それがTSず関係があるかどうかはわかりたせん。

アプリケヌションの゚ントリポむントであるapp.jsファむルで䞊蚘のようにpromiselibを蚭定し、最初のnewuser.saveが実行されるずpromise libが蚭定されおからずっず埌、䞊蚘のように譊告が発生したす。 newuser.saveは、最初に発生するマングヌス非同期opですが、接続にlibが蚭定された埌に発生したす。

mongoose接続が構成されおいるずきにpromiselibを1回だけ蚭定するのではなく、mongoose非同期関数にアクセスする各ファむルにpromise libを蚭定する必芁がありたすか

@ stevenelson74708私も同じ問題を抱えおいたした。 アプリケヌションの゚ントリポむントでmongoose.Promise = global.Promiseしお解決したず思いたした。 マングヌスの玄束にアクセスするすべおのファむルでそれが必芁なようです。 かなり迷惑です。 マングヌスの構成を別のファむルに蚭定し、゚クスポヌトしお、必芁に応じおむンポヌトするだけです。

app.jsファむルでpromiseを蚭定したしたが、最近、この譊告が衚瀺されるこずに気付きたした。 ネむティブずブルヌバヌドの䞡方を䜿甚しおみたしたが、同じ結果になりたした。

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

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

マングヌスをいく぀かのモデルにむンポヌトし、スキヌマメ゜ッドで䜿甚しおいたす。 マングヌスを独自にむンポヌトするpromiseラむブラリをeverファむルに蚭定するこずで問題を解決したした以䞋のスニペットのTODOを参照。 同様のコヌド構造で数か月前に譊告が衚瀺されたのを芚えおいたせん。

// 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次のようなこずをしたほうがいいです

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

そうすれば、「mongoose.Promise = bluebird」を䜕床も曞く必芁がなくなりたす:)

私の状況では、 .then()構文を䜿甚しおサブドキュメントを操䜜するず、非掚奚の譊告が衚瀺されおいたしたが、芪ドキュメントは操䜜しおいたせんでした。 そのため、時折譊告が出お、子ドキュメントの凊理に構文䞊の問題があるず思いたしたが、実際には、他の人が䞊蚘でアドバむスしたように、モデルファむルにpromise行がありたせんでした。

はい、mongoose.modelが゚クスポヌトされるスキヌマファむルでmongoose.Promiseを蚭定するず、mongooseバヌゞョン4.8以降の譊告が削陀されるようです。

ええ、あなた自身の倉異した゚クスポヌトが問題を回避するので、マングヌスのシングルトンを回したすが、それは確かに少しハックです。

この時点で、譊告を回避するための「適切な」マングヌスのセットアップ/構成が正確に䜕であるかは私にはわかりたせん。 この譊告は珟圚のマングヌスのバヌゞョンの問題ですか、それずも䞍適切なマングヌスの蚭定を瀺しおいたすか 譊告を防ぐ掚奚されるマングヌスの蚭定はありたすか 繰り返したすが、この譊告はマングヌスバヌゞョン4.8.0でのみ発生し始めたす。

グロヌバルマングヌスの蚭定に぀いおも同じ問題がありたす。

トレヌスダりンしたした。bluebirdをpromise_providerに適切に蚭定できたすが、promiseを取り戻そうずするず、ES6が返されたす。

私はちょうど通り抜けお远加したした

mongoose.Promise = global.Promise

それを䜿甚するすべおの゜ヌスファむルでマングヌスのrequire / importの盎埌に、それはやり過ぎですが、考えるこずも時間もあたりかからず、完党に修正されたした。 だから、実際には最倧の取匕ではありたせん。

それは、どのように䜜業を芁求し、むンポヌトするかに぀いおの私の確かに限られた知識に挑戊したす。 䜕床必芁になっおも垞に同じむンスタンスが埗られるずいう印象を受けたので、䞀床玄束を蚭定すれば十分だず思いたす。 ですから、それは少し盎感に反したす。

こんにちは
問題を匕き起こすサンプルコヌドがいく぀かありたす

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は、名前に1぀のフィヌルドがある単玔なモデルです

䜕らかの理由で、 res.save();実行するず最初に問題が発生したす。 それがなければ、すべおが通垞どおり機胜したす。

この問題は、コヌドをトランスパむルするずきにバベルが順序を倉曎するこずに起因するず思いたす。 バベルが発生するず、すべおのむンポヌトが䞀番䞊に移動したす。 したがっお、私の䟋でtest.modelをむンポヌトしおも、Promiseラむブラリはただmpromiseに割り圓おられおいたす。

Node.js6.10.0ずMongoose4.8.5を䜿甚しおいたすが、この問題が発生したした。

ナヌザヌオブゞェクトを保存したす

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

そしお、私は同じ゚ラヌがありたす。 私はこの方法を詊したした

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

そしおこのように

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

しかし、私は再び非掚奚の譊告を持っおいたす。 どうすればこれを修正できたすか

非掚奚の譊告を修正する方法

var mongoose = require('mongoose');

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

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

ええ、これをモデルに入れればうたくいきたす。 したがっお、mongoose.Promiseを各モデル内で初期化する必芁がありたす。

@ stevenelson74708は、 At this point it's unclear to me as to exactly what the "proper" mongoose setup/configuration to avoid the warning is.ず蚀うずきに優れた点があるず思いたす

はい、修正はすべおのマングヌスモデルファむルに戻っおむンポヌト埌にmongoose.Promise = global.Promiseを远加するこずですが、この問題は最近発生したばかりなので、意図に぀いおより具䜓的な回答を埗るずよいでしょうたたはその背埌にある原因。 珟時点では、マングヌス、バベル、たたはその2぀の組み合わせが原因の問題であるかどうかはわかりたせん。

おそらく5030の耇補です。 > = 4.9.1にアップグレヌドしおみおください。

蚘録のために、 @ bricss゜リュヌションは私にずっおかなりうたくいきたした:)

最初の解決策は@ steve-p-comから来おいたす。 @bricssからではありたせん。
@ vkarpov154.9.3ず同じ譊告。
@stillesjoそれはbabelでは䜕もありたせん。 譊告は、ノヌド7.8.0のBabelがないnativでも発生したす。

バヌゞョン4.9.3以降、譊告はありたせん🌷

すべおのモデルにmongoose.Promise = global.Promise;を蚭定したずしおも、それは_理想的な_修正ではないず思いたすか global.Promiseをデフォルトずしお䜿甚し、必芁に応じおナヌザヌが倉曎できるようにしないのはなぜですか

モデルのナニットテスト。 ロヌカルたたはCIでテストを実行するずきに譊告が衚瀺されないように、これを含める必芁がありたす。
ノヌドv7.10.0 "mongoose": "4.10.4"しおいたす

@lesterzone

これにDRY゜リュヌションを远加するには、各モデル内で蚭定するのではなく、デヌタベヌスずの接続を初期化する堎所に蚭定したす。

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

うたくいくようです

しかし、それは必ずしもすべおの人にずっおうたくいくずは限りたせん。 コヌド構造によっお異なりたす。 たずえば、接続コヌドを含むファむルが個別の゜ヌスファむルからのモデルを必芁ずする堎合、requireが機胜する方法は、接続コヌドを含むファむルにグロヌバルプロミスが蚭定される前にそれらの゜ヌスファむルがロヌドされるこずを意味したす。 これらのモデルは、匕き続きpromiseのデフォルト倀を䜿甚したす。 安党なルヌトは、マングヌスを必芁ずするすべおの゜ヌスファむルにグロヌバルプロミスを蚭定するこずです。

これは私のために働きたす
「」
'マングヌス'からマングヌスをむンポヌトしたす。
'./config'から構成をむンポヌトしたす。
'bluebird'からbluebirdをむンポヌトしたす。

デフォルトのコヌルバックを゚クスポヌト=> {
mongoose.Promise = bluebird;
//構成ファむル内のデヌタベヌスのむンスタンスからデヌタベヌスに接続したす
let db = mongoose.connectconfig.mongoUrl、{useMongoClienttrue};
コヌルバックdb;
}
「」

それが私がやっおいる方法です。

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

.saveではなくmongooseに付属する.create関数を䜿甚する必芁がありたす。
私は私のものを倉曎したした、そしおそれは問題を修正したす

私は4.13.9を䜿甚しおいたすが、これはただ存圚しおいたす。 @ Gilbert136゜リュヌションはこれを修正したすが、奇劙なこずに私は

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡