useNewUrlParserをtrueに設定することにより、「現在のURL文字列パーサーは非推奨です」という警告を回避


239

MongoDBインスタンスへの接続を確立するデータベースラッパークラスがあります。

async connect(connectionString: string): Promise<void> {
        this.client = await MongoClient.connect(connectionString)
        this.db = this.client.db()
}

これは私に警告を与えました:

(ノード:4833)DeprecationWarning:現在のURL文字列パーサーは非推奨であり、将来のバージョンでは削除される予定です。新しいパーサーを使用するには、オプション{useNewUrlParser:true}をMongoClient.connectに渡します。

このconnect()メソッドは、MongoClientOptions2番目の引数としてインスタンスを受け入れます。ただし、というプロパティはありませんuseNewUrlParser。また、これらのプロパティを接続文字列に次のように設定しようとしましたが、mongodb://127.0.0.1/my-db?useNewUrlParser=true警告には影響しません。

ではuseNewUrlParser、これらの警告を削除するように設定するにはどうすればよいですか?スクリプトはcronとして実行する必要があり、これらの警告はゴミメールのスパムにつながるため、これは私にとって重要です。

対応するmongodbバージョンのドライバを使用しています3.1.0-beta4@types/mongodbパッケージのしてい3.0.18ます。どちらも最新のを使用して使用できnpm installます。

回避策

古いバージョンのmongodbドライバーを使用する:

"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"

5
それbetaは、週末に何とかnpmにリリースされたバージョンから来ています。APIが実際に確定するまで、心配する必要はありません。あなたは安定版をインストールする正しいことをしました。
Neil Lunn、

1
mongodbの3.0.0を超える場合、単純にmongoose.connect( "mongodb:// localhost:portnumber / YourDB"、{useNewUrlParser:true})を追加します
追加し Majedur Ra​​haman

回答:


402

mongoバージョンを確認します。

mongo --version

バージョン> = 3.1.0を使用している場合は、mongo接続ファイルを->に変更します

MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })

またはあなたのマングース接続ファイル->

mongoose.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true });

理想的には、バージョン4の機能ですが、v3.1.0以降でもサポートされています。チェックアウトのMongoDBのGitHubの 詳細については。


1
@AbhishekSinha mongo> = 4.0.0を使用する理由 3.6.5を使用していますが、迷惑なメッセージも消えています。
18

うんそれを修正しました。基本的にはv4の機能ですが、v3.1.0以降では新機能もサポートしています。
Abhishek Sinha

3
これは最高です、追加したいだけです。コールバックがある場合、特にエラーの場合は、これを使用してください:mongoose.connect(dbUrl、{useNewUrlParser:true}、function(err){console.log( "mongoDB connected"、 err);})
ptts 2018年

ありがとう、プロのように修正
Hidayt Rahman

46

すでに述べたよう3.1.0-beta4に、ドライバーのリリースは見た目から少し早く「実際にリリース」されました。このリリースは、MongoDB 4.0の今後のリリースで新しい機能をサポートし、他のいくつかのAPIを変更するために進行中の作業の一部です。

現在の警告をトリガーするそのような変更の1つはuseNewUrlParserオプションです。これは、接続URIの受け渡しが実際に機能する方法に関するいくつかの変更によるものです。詳細は後ほど。

状況が「落ち着く」までは、少なくともリリースのマイナーバージョンに「固定」することをお勧めし3.0.xます。

  "dependencies": {
    "mongodb": "~3.0.8"
  }

これ3.1.xにより、ノードモジュールへの「新規」インストールでインストールされるブランチが停止します。「ベータ」バージョンである「最新」リリースをすでにインストールしている場合は、パッケージ(およびpackage-lock.json)をクリーンアップし、それを3.0.xシリーズリリースにまで削減する必要があります。

「新しい」接続URIオプションを実際に使用する場合の主な制限はport、接続文字列に実際にを含めることです。

const { MongoClient } = require("mongodb");
const uri = 'mongodb://localhost:27017';  // mongodb://localhost - will fail

(async function() {
  try {

    const client = await MongoClient.connect(uri,{ useNewUrlParser: true });
    // ... anything

    client.close();
  } catch(e) {
    console.error(e)
  }

})()

新しいコードでは、これはより「厳密な」ルールです。主なポイントは、現在のコードは基本的に「ノードネイティブドライバー」(npm mongodb)リポジトリコードの一部であり、「新しいコード」は実際にmongodb-coreは「パブリック」ノードドライバーを「支える」ライブラリーからインポートされるということです。

追加される「オプション」のポイントは、新しいコードにオプションを追加することにより、移行を「容易にする」ことです。これにより、新しいパーサー(実際には url)がオプションを追加するコードで使用され、非推奨の警告がクリアされるため、渡された接続文字列は、実際には新しいパーサーが期待しているものに準拠しています。

将来のリリースでは、「レガシー」パーサーは削除され、新しいパーサーはオプションなしでも使用されるようになります。しかしその時までに、既存のすべてのコードには、新しいパーサーが期待しているものに対して既存の接続文字列をテストする十分な機会があったと予想されます。

したがって、新しいドライバー機能がリリースされたときに使用を開始する場合は、利用可能なbetaリリースと後続のリリースを使用し、理想的には、新しいパーサーで有効な接続文字列を提供してuseNewUrlParserMongoClient.connect()

MongoDB 4.0リリースのプレビューに関連する機能に実際にアクセスする必要がない場合は、3.0.x前述のようにバージョンをシリーズに固定してください。これは文書化3.1.xされたとおりに機能し、「固定」することで、実際に安定したバージョンをインストールするまで、期待される依存関係に対してリリースが「更新」されないことが保証されます。


1
「野生に解放された」と言ったときの意味について、もっと詳しい情報はありますか?3.1.0-beta4はどのようにして動物園から脱出したのですか?それについての参考文献を引用できますか?
Wyck

2
@Wyck "参照"はもちろん質問が行われたときにnpm install mongodb行われ、"ベータ"(質問に示されているバージョン文字列で明確にマークされている)がインストールされstableます。されるべきではなかった。これは確かに当時のエラーであり、バージョン文字列内alphaまたはbetaバージョン文字列内に表示されているコードリリースが同様に安定しているとマークされている場合は、常に考慮する必要があります。当然のことながら時間が経過しましたが、これは安定版リリースの機能であり、(記載されているように)最終的にはなくなる予定です。
Neil Lunn

45

以下の強調表示されたコードは、mongoose接続に対して、mongooseドライバーの警告を解決しました。

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });

4
私のために働いていません。まだ取得中:(node:35556)DeprecationWarning:現在のURL文字列パーサーは非推奨であり、将来のバージョンでは削除される予定です。新しいパーサーを使用するには、オプション{useNewUrlParser:true}をMongoClient.connectに渡します。
Alex

それでも機能しない場合は、DBパスを指定する場所にserver.jsまたはapp.jsを保存する必要があります。package.jsonファイルがある場合は常にnpm installを入力してnode_modulesを削除し、再インストールしてください
Narendra Maru

24

変更することは何もありません。接続関数でのみ渡す{useNewUrlParser: true }

これは動作します:

MongoClient.connect(url, {useNewUrlParser: true}, function(err, db) {
    if(err) {
        console.log(err);
    }
    else {
        console.log('connected to ' + url);
        db.close();
    }
})

私が必要とするものだけですが、警告メッセージはまだそこにあります:-S
alex351

私のために働く、警告はもうありません。
Q.チャオ

17

{ useNewUrlParser: true }mongoose.connect()メソッドを追加する必要があります。

mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });

1
この回答は、数か月前に投稿された他の回答と同じです
ダニエルW.

これは以前の回答とどう違うのですか?
Peter Mortensen

@PeterMortensenは、最初に回答を投稿した日付を確認してください
KARTHIKEYAN.A

15

接続文字列の形式は、mongodb:// user:password @ host:port / dbである必要があります

例えば:

MongoClient.connect('mongodb://user:password@127.0.0.1:27017/yourDB', { useNewUrlParser: true } )

いいえMongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )
Nino Filiu

これは以前の回答とどう違うのですか?
Peter Mortensen

15

次のようにデータベースに接続する前に、次の設定を行う必要があります。

const mongoose = require('mongoose');

mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

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

また、

Replace update() with updateOne(), updateMany(), or replaceOne()
Replace remove() with deleteOne() or deleteMany().
Replace count() with countDocuments(), unless you want to count how many documents are in the whole collection (no filter).
In the latter case, use estimatedDocumentCount().

3
一番の答えになるはずです。私のための他のすべての答えは惨めに失敗しました。
Anthony

Plsはansをcorrect、それがあなたのために働いているかのようにマークします。それも私のために働いた!
Arpan Banerjee

9

次の作品

const mongoose = require('mongoose');

mongoose.connect("mongodb://localhost/playground", { useNewUrlParser: true,useUnifiedTopology: true })
.then(res => console.log('Connected to db'));

mongooseバージョンがあります5.8.10


1
これも私のために働いた。私は使用していますbody-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Arpan Banerjee

8

追加する必要はないと思います { useNewUrlParser: true }

新しいURLパーサーをすでに使用したいかどうかはあなた次第です。MongoDBが新しいURLパーサーに切り替わると、最終的に警告は消えます。

接続文字列URI形式で指定されているとおりでているように、ポート番号を設定する必要はありません。

追加する{ useNewUrlParser: true }だけで十分です。


1
ポート番号を追加しましたが、それでもエラーメッセージが表示されます。エラーメッセージが非常にわかりにくく、誤解を招くのがわかります。実際に古い形式を使用していて、完全に機能しているにもかかわらず、新しい形式を使用するように指示するメッセージが表示されるのはなぜですか。
ニコ

2
良い質問!これは警告です。エラーではありません。追加するuseNewUrlParser: trueことによってのみ、警告は消えます。しかし、mongoが新しいURLパーサーに切り替わると、この余分なパラメーターが廃止されるため、これは少し愚かです。
サム

ポート番号が新しいURLパーサーが予期しているものであることをどのようにして知りましたか?新しいURLパーサーが実際に何であるかを説明するものは何も見つかりません
Brad

@Brad、確かに。私はあなたがポート番号を追加する必要があると想定していましたが、Mongo仕様ではポート番号はオプションであるとまだ述べています。私はそれに応じて私の答えを更新しました。
サム・

8

ECMAScript 8用に更新 /お待ちください

MongoDB incが提供する不正なECMAScript 8デモコードもこの警告を作成します。

MongoDBは次のアドバイスを提供しますが、これは誤りです

新しいパーサーを使用するには、オプション{useNewUrlParser:true}をMongoClient.connectに渡します。

これを行うと、次のエラーが発生します。

TypeError:への最後の引数executeOperationはコールバックでなければなりません

代わりに、オプションを提供する必要がありますnew MongoClient

以下のコードを参照してください。

const DATABASE_NAME = 'mydatabase',
    URL = `mongodb://localhost:27017/${DATABASE_NAME}`

module.exports = async function() {
    const client = new MongoClient(URL, {useNewUrlParser: true})
    var db = null
    try {
        // Note this breaks.
        // await client.connect({useNewUrlParser: true})
        await client.connect()
        db = client.db(DATABASE_NAME)
    } catch (err) {
        console.log(err.stack)
    }

    return db
}

7

この問題は、ポート番号を指定してこのパーサーを使用することで解決できます。 {useNewUrlParser: true}

解決策は次のとおりです。

mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });

それは私の問題を解決します。


3
コンソール自体は、追加する溶液を得たuseNewUrlParser property中にconnect、しかし、あなたのソリューションを助けました。とても賛成です!
ganeshdeshmukh 2018

7

Express.js、API呼び出しケース、JSONコンテンツの送信の完全な例は次のとおりです。

...
app.get('/api/myApi', (req, res) => {
  MongoClient.connect('mongodb://user:password@domain.com:port/dbname',
    { useNewUrlParser: true }, (err, db) => {

      if (err) throw err
      const dbo = db.db('dbname')
      dbo.collection('myCollection')
        .find({}, { _id: 0 })
        .sort({ _id: -1 })
        .toArray(
          (errFind, result) => {
            if (errFind) throw errFind
            const resultJson = JSON.stringify(result)
            console.log('find:', resultJson)
            res.send(resultJson)
            db.close()
          },
        )
    })
}

4

ここに私がそれを持っている方法があります。ヒントは、2日前にnpmを更新するまでコンソールに表示されませんでした。

.connectには、URI、オプション、エラーの3つのパラメーターがあります。

mongoose.connect(
    keys.getDbConnectionString(),
    { useNewUrlParser: true },
    err => {
        if (err) 
            throw err;
        console.log(`Successfully connected to database.`);
    }
);

4

私たちは使用していた:

mongoose.connect("mongodb://localhost/mean-course").then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});

→これにより、URLパーサーエラーが発生します

正しい構文は次のとおりです。

mongoose.connect("mongodb://localhost:27017/mean-course" , { useNewUrlParser: true }).then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});

1
いくつかの説明を追加
Mathews Sunny

4

追加するだけです

{ useNewUrlParser: true }

mongoose.connectメソッド内。


1
これは以前の回答とどう違うのですか?
Peter Mortensen

ハッシュを確認してください。
AGrush

2

次のバージョン5.9.16の私のための作品

const mongoose = require('mongoose');

mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

mongoose.connect('mongodb://localhost:27017/dbName')
    .then(() => console.log('Connect to MongoDB..'))
    .catch(err => console.error('Could not connect to MongoDB..', err))

1

これらの行は、他のすべての非推奨警告に対してもトリックを行いました:

const db = await mongoose.createConnection(url, { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);

1

MongoDBデータベースとしてmlab.comを使用していました。接続文字列を別の名前のフォルダーに分離し、configファイルkeys.js内で次の接続文字列を保持しました。

module.exports = {
  mongoURI: "mongodb://username:password@ds147267.mlab.com:47267/projectname"
};

そしてサーバーコードは

const express = require("express");
const mongoose = require("mongoose");
const app = express();

// Database configuration
const db = require("./config/keys").mongoURI;

// Connect to MongoDB

mongoose
  .connect(
    db,
    { useNewUrlParser: true } // Need this for API support
  )
  .then(() => console.log("MongoDB connected"))
  .catch(err => console.log(err));

app.get("/", (req, res) => res.send("hello!!"));

const port = process.env.PORT || 5000;

app.listen(port, () => console.log(`Server running on port ${port}`)); // Tilde, not inverted comma

上記のように、接続文字列の後に{useNewUrlParser:true}を記述する必要があります。

簡単に言えば、次のことを行う必要があります。

mongoose.connect(connectionString,{ useNewUrlParser: true } 
// Or
MongoClient.connect(connectionString,{ useNewUrlParser: true } 
    


1

プロジェクトにmongooseバージョン5.xを使用しています。mongooseパッケージを要求した後、以下のようにグローバルに値を設定します。

const mongoose = require('mongoose');

// Set the global useNewUrlParser option to turn on useNewUrlParser for every connection by default.
mongoose.set('useNewUrlParser', true);

0

usernameまたはpassword@文字がある場合は、次のように使用します。

mongoose
    .connect(
        'DB_url',
        { user: '@dmin', pass: 'p@ssword', useNewUrlParser: true }
    )
    .then(() => console.log('Connected to MongoDB'))
    .catch(err => console.log('Could not connect to MongoDB', err));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.