Skip to content

strictQuery 非推奨警告と接続エラーの解決法

問題概要

Mongooseを使用してMongoDBに接続する際に、以下の2つのエラーが発生する状況です:

  1. strictQueryに関する非推奨警告:

    (node:15848) [MONGOOSE] DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7.
  2. 接続タイムアウトエラー:

    MongooseError: Operation `fruits.insertOne()` buffering timed out after 10000ms

これらのエラーにより、データベース接続が失敗し、データの保存が行われません。以下に効果的な解決方法を解説します。


エラー解決方法

1. strictQuery 警告の解決

この警告はMongoose 7でのデフォルト動作変更に関するものです。以下のいずれかの方法で解決します:

js
// 警告を完全に非表示にする場合 (schema未定義のフィールドを拒否)
mongoose.set('strictQuery', true);

// 将来の動作に備える場合 (schema未定義のフィールドを許可)
mongoose.set('strictQuery', false);

重要

設定は 必ずmongoose.connect()より前に記述してください。設定順序を間違えると警告が消えません。

js
// ❌ 間違った順序 (警告が出続ける)
mongoose.connect('mongodb://localhost:27017/db');
mongoose.set('strictQuery', true);
js
// ✅ 正しい順序
mongoose.set('strictQuery', true); // 先に設定
mongoose.connect('mongodb://localhost:27017/db'); // その後接続

2. 接続タイムアウトエラーの解決

localhost関連のネットワーク問題による接続失敗を修正します:

js
// localhostの代わりに127.0.0.1を使用
mongoose.connect('mongodb://127.0.0.1:27017/fruitsDB');

もしくは最新の接続オプションを追加:

js
mongoose.connect('mongodb://127.0.0.1:27017/fruitsDB', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

接続チェック

接続成功時に通知が表示されるよう、コールバックを追加することを推奨します:

js
mongoose.connect(/* ... */)
  .then(() => console.log('MongoDB接続成功'))
  .catch(err => console.error('接続エラー:', err));

完全な修正コード例

js
const mongoose = require("mongoose");

// 1. strictQueryを先に設定
mongoose.set('strictQuery', true); // または false

// 2. 127.0.0.1を使用 + 接続オプション追加
mongoose.connect("mongodb://127.0.0.1:27017/fruitsDB", {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// 3. 接続イベントハンドリング
mongoose.connection.on('connected', () => {
  console.log('MongoDBに接続されました');
});

mongoose.connection.on('error', (err) => {
  console.error('接続エラー:', err);
});

// 以下スキーマ定義とデータ操作...

strictQueryの動作解説

設定値による挙動の違い

設定値動作推奨ケース
trueスキーマで未定義のフィールドを拒否厳密なデータ構造が必要な場合
false未定義フィールドを許可(Mongoose 7のデフォルト)柔軟なデータ保存が必要な場合

変更の背景

Mongoose 6ではstrictQueryのデフォルトがtrueでしたが、多くのユーザーが意図せずデータ保存に失敗するケースが多発しました。そのためMongoose 7では後方互換性を優先し、デフォルトをfalseに戻す方針です。

js
// Mongoose 6: デフォルト true
// Mongoose 7: デフォルト false(変更予定)

// 明示的に設定することでバージョン間の互換性を確保
mongoose.set('strictQuery', false);

プロダクション環境での注意

strictQuery: falseは開発中の柔軟性を高めますが、本番環境では意図しないフィールドが保存されるリスクがあります。スキーマ設計を厳密に行うことを推奨します。


よくある質問

Q. MongoDBコンテナを使っている場合の接続文字列は?

Docker環境ではサービス名をホスト名に使用します:

js
// Docker Composeのサービス名が'mongo'の場合
mongoose.connect('mongodb://mongo:27017/dbname');

Q. 環境変数を使った接続方法は?

dotenvで環境変数をロードして使用します:

js
require('dotenv').config(); // .envファイルを読み込み

mongoose.connect(process.env.MONGODB_URI, {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

Q. Atlas接続時のタイムアウト対策は?

接続文字列にretryWritesを追加:

js
mongoose.connect('mongodb+srv://user:pass@cluster.mongodb.net/db?retryWrites=true&w=majority', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

まとめ

  1. strictQuery 警告mongoose.set('strictQuery', ...) を接続前に実行
  2. 接続タイムアウトlocalhost の代わりに 127.0.0.1 を使用
  3. ベストプラクティス → 接続オプションとエラーハンドリングを実装

上記対策を実施することで、Mongooseの警告メッセージを解消し、安定したデータベース接続を実現できます。Mongoose 7でのデフォルト値変更を見据えたコード記述が今後の互換性維持に重要です。