strictQuery 非推奨警告と接続エラーの解決法
問題概要
Mongooseを使用してMongoDBに接続する際に、以下の2つのエラーが発生する状況です:
strictQueryに関する非推奨警告:(node:15848) [MONGOOSE] DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7.接続タイムアウトエラー:
MongooseError: Operation `fruits.insertOne()` buffering timed out after 10000ms
これらのエラーにより、データベース接続が失敗し、データの保存が行われません。以下に効果的な解決方法を解説します。
エラー解決方法
1. strictQuery 警告の解決
この警告はMongoose 7でのデフォルト動作変更に関するものです。以下のいずれかの方法で解決します:
// 警告を完全に非表示にする場合 (schema未定義のフィールドを拒否)
mongoose.set('strictQuery', true);
// 将来の動作に備える場合 (schema未定義のフィールドを許可)
mongoose.set('strictQuery', false);重要
設定は 必ずmongoose.connect()より前に記述してください。設定順序を間違えると警告が消えません。
// ❌ 間違った順序 (警告が出続ける)
mongoose.connect('mongodb://localhost:27017/db');
mongoose.set('strictQuery', true);// ✅ 正しい順序
mongoose.set('strictQuery', true); // 先に設定
mongoose.connect('mongodb://localhost:27017/db'); // その後接続2. 接続タイムアウトエラーの解決
localhost関連のネットワーク問題による接続失敗を修正します:
// localhostの代わりに127.0.0.1を使用
mongoose.connect('mongodb://127.0.0.1:27017/fruitsDB');もしくは最新の接続オプションを追加:
mongoose.connect('mongodb://127.0.0.1:27017/fruitsDB', {
useNewUrlParser: true,
useUnifiedTopology: true
});接続チェック
接続成功時に通知が表示されるよう、コールバックを追加することを推奨します:
mongoose.connect(/* ... */)
.then(() => console.log('MongoDB接続成功'))
.catch(err => console.error('接続エラー:', err));完全な修正コード例
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に戻す方針です。
// Mongoose 6: デフォルト true
// Mongoose 7: デフォルト false(変更予定)
// 明示的に設定することでバージョン間の互換性を確保
mongoose.set('strictQuery', false);プロダクション環境での注意
strictQuery: falseは開発中の柔軟性を高めますが、本番環境では意図しないフィールドが保存されるリスクがあります。スキーマ設計を厳密に行うことを推奨します。
よくある質問
Q. MongoDBコンテナを使っている場合の接続文字列は?
Docker環境ではサービス名をホスト名に使用します:
// Docker Composeのサービス名が'mongo'の場合
mongoose.connect('mongodb://mongo:27017/dbname');Q. 環境変数を使った接続方法は?
dotenvで環境変数をロードして使用します:
require('dotenv').config(); // .envファイルを読み込み
mongoose.connect(process.env.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true
});Q. Atlas接続時のタイムアウト対策は?
接続文字列にretryWritesを追加:
mongoose.connect('mongodb+srv://user:pass@cluster.mongodb.net/db?retryWrites=true&w=majority', {
useNewUrlParser: true,
useUnifiedTopology: true
});まとめ
strictQuery警告 →mongoose.set('strictQuery', ...)を接続前に実行- 接続タイムアウト →
localhostの代わりに127.0.0.1を使用 - ベストプラクティス → 接続オプションとエラーハンドリングを実装
上記対策を実施することで、Mongooseの警告メッセージを解消し、安定したデータベース接続を実現できます。Mongoose 7でのデフォルト値変更を見据えたコード記述が今後の互換性維持に重要です。