簡體   English   中英

MongooseServerSelectionError:連接 ECONNREFUSED::1:27017

[英]MongooseServerSelectionError: connect ECONNREFUSED ::1:27017

當我嘗試使用 Mongoose 將我的應用程序與我的數據庫連接時出現問題。已經嘗試了以下我在谷歌上找到的解決方案:

  • 在 windows 上重啟 MongoDB 服務
  • 使用位於 mongodb 的 bin 文件中的 cmd 手動打開數據庫

但我無法解決它。 誰能幫我?

//my connection
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/notes-db-app',{
    useNewUrlParser: true, 
    useUnifiedTopology: true
})
.then(db => console.log('DB is connected'))
.catch(err => console.log(err));

拋出我,這個錯誤

MongooseServerSelectionError:連接 ECONNREFUSED::1:27017 在 NativeConnection.Connection.openUri (C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\connection.js:797:32) 在 C:\Users \ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\index.js:330:10 在 C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\helpers\promiseOrCallback。 js:32:5 在新的 Promise () 在 promiseOrCallback (C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\helpers\promiseOrCallback.js:31:10) 在 Mongoose._promiseOrCallback (C :\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\index.js:1151:10) 在 Mongoose.connect (C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\ mongoose\lib\index.js:329:20) 在 Object。 (C:\Users\ivan\Desktop\NodeJS\notes-app\src\db.js:3:10)
在 Module._compile (node:internal/modules/cjs/loader:1095:14) 在 Object.Module._extensions..js (node:internal/modules/cjs/loader:1147:10) {
原因:TopologyDescription { type: 'Unknown', servers: Map(1) { 'localhost:27017' => [ServerDescription] }, stale: false, compatible: true, heartbeatFrequencyMS: 10000, localThresholdMS: 15, logicalSessionTimeoutMinutes: undefined } }

我嘗試像這樣將端口放在我的連接代碼上

//my connection
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/notes-db-app',{
    useNewUrlParser: true, 
    useUnifiedTopology: true
})
.then(db => console.log('DB is connected'))
.catch(err => console.log(err));

它給我帶來了另一個錯誤

MongooseServerSelectionError:無效的消息大小:1347703880,最大允許:67108864 在 NativeConnection.Connection.openUri (C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\connection.js:797:32) 在 C :\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\index.js:330:10 at C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\helpers \promiseOrCallback.js:32:5 在新的 Promise () 在 promiseOrCallback (C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\helpers\promiseOrCallback.js:31:10) 在 Mongoose。 _promiseOrCallback (C:\Users\ivan\Desktop\NodeJS\notes-app\node_modules\mongoose\lib\index.js:1151:10) 在 Mongoose.connect (C:\Users\ivan\Desktop\NodeJS\notes-app \node_modules\mongoose\lib\index.js:329:20) 在 Object。 (C:\Users\ivan\Desktop\NodeJS\notes-app\src\db.js:3:10)
在 Module._compile (node:internal/modules/cjs/loader:1095:14) 在 Object.Module._extensions..js (node:internal/modules/cjs/loader:1147:10) {
原因:TopologyDescription { type: 'Unknown', servers: Map(1) { 'localhost:3000' => [ServerDescription] }, stale: false, compatible: true, heartbeatFrequencyMS: 10000, localThresholdMS: 15, logicalSessionTimeoutMinutes: undefined } }

const uri = 'mongodb://localhost:27017/test';

const options = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    serverSelectionTimeoutMS: 5000,
    autoIndex: false, // Don't build indexes
    maxPoolSize: 10, // Maintain up to 10 socket connections
    serverSelectionTimeoutMS: 5000, // Keep trying to send operations for 5 seconds
    socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
    family: 4 // Use IPv4, skip trying IPv6
}

const connectWithDB = () => {
    mongoose.connect(uri, options, (err, db) => {
      if (err) console.error(err);
      else console.log("database connection")
    })
}

connectWithDB()

我終於解決了。

啟用 MongoDB 默認禁用的 IPV6。 在 CMD 上使用以下命令行:

mongod --ipv6 

然后再試一次連接就可以了!

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/notes-db-app',{
    useNewUrlParser: true, 
    useUnifiedTopology: true
})
.then(db => console.log('DB is connected'))
.catch(err => console.log(err));

代表提問者發布

只需傳遞第三個參數family:4即。

mongoose.connect('mongodb://localhost/notes-db-app',{
    useNewUrlParser: true, 
    useUnifiedTopology: true,
    family: 4,
})

如果錯誤狀態:

連接()錯誤:MongooseServerSelectionError:連接 ECONNREFUSED ::1:27017

然后在 IPv6 地址::1上拒絕與localhost的連接。 Mongoose 默認使用 IPv6 ..

為了快速檢查,您可以顯式設置 IPv4 地址:

 mongoose.connect('mongodb://127.0.0.1/test')

可能您要連接的服務器的主機名/IP 設置不正確。
我習慣於將該錯誤視為:

MongooseServerSelectionError: connect ECONNREFUSED <hostname/hostIP>:<port>

在您發布的控制台日志中, <hostname/hostIP>部分格式錯誤/丟失。

示例- 對於在端口27017本地運行的 mongodb 服務器,這是服務器關閉時的錯誤:

MongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017

如果您使用 mongodb URI 連接到數據庫,請確保它看起來像這樣

"mongodb://<hostname/hostIP>:<port>"
  1. 打開終端並輸入以下命令: mongod
  2. 然后使用您的 app.js 通過編寫以下代碼來建立連接:
     const mongoose=require("mongoose"); mongoose.connect('mongodb://localhost/notes-db-app',{ useNewUrlParser: true, useUnifiedTopology: true, family: 4, })
  3. 現在已經完成了。 只需打開您的 mongo shell 或 mongodb 指南針並查找您添加的任何內容。

問題是, localhost別名解析為 IPv6 地址::1而不是127.0.0.1

但是, net.ipv6默認為false

最好的選擇是使用以下配置啟動 MongoDB:

net:
  ipv6: true
  bindIpAll: true

或者

net:
  ipv6: true
  bindIp: localhost

然后所有變體都應該起作用:

C:\>mongosh "mongodb://localhost:27017" --quiet --eval "db.getMongo()"
mongodb://localhost:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0

C:\>mongosh "mongodb://127.0.0.1:27017" --quiet --eval "db.getMongo()"
mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0

C:\>mongosh "mongodb://[::1]:27017" --quiet --eval "db.getMongo()"
mongodb://[::1]:27017/?directConnection=true&appName=mongosh+1.6.0

如果您不將 MongoDB 作為服務運行,那么它將是

mongod --bind_ip_all --ipv6 <other options>

注意,我不喜歡配置

net:
  bindIp: <ip_address>

在我看來,這只在具有多個網絡接口的計算機上才有意義。 使用bindIp: localhost如果你需要阻止來自遠程計算機的任何連接(例如,在維護時或用作 Web 服務的后端數據庫時),否則使用bindIpAll: true

在代碼的開頭使用它:

const dns = require('dns');

// Set default result order for DNS resolution
dns.setDefaultResultOrder('ipv4first');

MongoDB 是否在 PORT 27017 上運行? 確保它在指定的端口上運行。 看看它是否能解決你的問題。 還要檢查您的憑據:Mongo 用戶名和密碼。

如果您發布了數據庫連接的源代碼,那會更有幫助。

我也遇到了同樣的問題,這些命令對我有用(Ubuntu 機器)

sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown mongodb:mongodb /tmp/mongodb-27017.sock

然后

sudo service mongod restart

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM