簡體   English   中英

“錯誤:MongooseError:操作 `users.insertOne()` 緩沖在 10000 毫秒后超時”,

[英]"Error: MongooseError: Operation `users.insertOne()` buffering timed out after 10000ms",

我在 node express 上運行 MongoDB Atlas,當我用 postman 測試時出現了這個錯誤。

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');

require('dotenv').config();

const app = express();
const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json());

const uri = process.env.ATLAS_URI;
mongoose.connect(uri, { useNewUrlParser: true, useCreateIndex: true }
);
const connection = mongoose.connection;
connection.once('open', () => {
  console.log("MongoDB database connection established successfully");
})

const exercisesRouter = require('./routes/exercises');
const usersRouter = require('./routes/users');

app.use('/exercises', exercisesRouter);
app.use('/users', usersRouter);

app.listen(port, () => {
    console.log(`Server is running on port: ${port}`);
});

這是我的.env ,我猜問題也可能在這里,請幫忙:

ATLAS_URI=mongodb+srv://userone:useronepassword1234@cluster0.swye5.mongodb.net/<dbname>?retryWrites=true&w=majority

就我而言,我必須將 go 設置為 Atlas,並將我列入白名單的 IP 重置為正確的地址。

然后我重新啟動了我的本地服務器並嘗試在 postman 上再次發布......它成功了!

  1. 首先將<dbname>替換為您的實際數據庫名稱,如果未創建,請創建一個。

  2. 然后根據需要在 Atlas UI 上創建集合。

  3. 在網絡訪問中,單擊添加 IP ADDRESS 和 select“允許從任何地方訪問”。

  4. 用這種方式重寫你的代碼:

mongoose 
 .connect(process.env.MONGO_PROD_URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true,   })   
 .then(() => console.log("Database connected!"))
 .catch(err => console.log(err));
  1. 現在您的數據庫應該已連接並且工作正常。

如果仍未解決,請檢查此鏈接

我面臨着同樣的問題。 解決了。 我認為您可能不允許 Atlas 中的每個人都可以訪問網絡:MongoDB。 這樣做會解決問題。

在 MongoDB 雲中檢查您的網絡訪問 IP 列表。您將只能從 IP 地址列表連接到您的集群

確保您的 IP 地址設置處於活動狀態

檢查您是否忘記在連接字符串中設置密碼。

步驟1:

Go 到您的 Atlas 帳戶並打開您的項目。

第2步:

在左側菜單中,導航到Network Access部分:

在此處輸入圖像描述

第 3 步:

添加您的 IP 地址,以便只有您能夠連接到您的集群。 您還可以添加0.0.0.0/0 ,它將允許從任何地方訪問。

我也面臨同樣的錯誤。 就我而言,出現錯誤是因為在 mongoose 連接useFindAndModify設置為false

有錯誤的代碼

mongoose.connect(dbUrl, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true, 
    useFindAndModify: false 
}, () => { 
    console.log('connected to database myDb ;)') 
})

工作代碼

mongoose.connect(dbUrl, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true
}, () => { 
    console.log('connected to database myDb ;)') 
})

如果您使用 Typescript 看到此內容,請確保您從 mongoose 導入連接 function 並使用它進行連接。

import { connect } from "mongoose";

connect(...).then()

有點晚了,但可能是因為這條線useCreateIndex: true它不起作用。 似乎在 mongoDB 版本 5 中。不再支持此功能。 像 manoj_mi5 的答案一樣重寫

mongoose
  .connect(process.env.MONGODB_URL, {
      useNewUrlParser: true,
      useUnifiedTopology: true})
  .then(() => console.log("Database connected!"))
  .catch(err => console.log(err));

檢查是否有更多錯誤。

更改您的 MongoDB 數據庫用戶密碼。 它應該是沒有特殊字符的字母數字。 對我來說沒有任何效果,但是更改密碼確實有效。

“錯誤:MongooseError:操作users.insertOne()緩沖在 10000 毫秒后超時”

 mongoose.connect(process.env.MONGO_URL, { useNewURLParser: true, useUnifiedTopology: true, useCreateIndex: true, },6000000).then(console.log("connected to server")).catch((err) => console.log(err));

在選項后添加時間,例如 6000000

在 Mongoose 版本 6 及更高版本中不需要這些

{    useNewUrlParser: true, 
     useUnifiedTopology: true, 
     useCreateIndex: true, 
     useFindAndModify: false
}

所以只需刪除它。 如果您仍然看到app crashed - waiting for file changes before starting...只需再保存一次,它就會工作

在 mongoose 的最新版本中。

我們不需要這個 object。

{ useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }

但是,如果您正在處理舊版本的 mongoose,那么您肯定需要它。 同樣在您的 mongodb 網絡地址中添加此地址 0.0.0.0/0 代替您的 ip 地址。

在這行代碼中,ATLAS_URI=mongodb+srv://userone:useronepassword1234@cluster0.swye5.mongodb.net/?retryWrites=true&w=majority

確保您寫的實際數據庫名稱不帶 < > 符號。 您必須首先在 Mongo Atlas 中創建數據庫。 在此處輸入圖像描述

為了解決這個問題,我在 index.js 中創建了一個 function,我在其中異步連接到我的數據庫,然后啟動服務器,因為 mongoose 不等待數據庫連接它就地執行所有操作,對我來說這就是問題所在。

async function start() {
  try {
    //Database Connect
    await mongoose.connect(
      process.env.DB_CONNECTION,
      {
        useNewUrlParser: true,
        useUnifiedTopology: true,
      },
      () => {
        console.log("Database Connected");
      }
    );

    app.listen(3000, () => {
      console.log("Server is running on port 3000 ...");
    });
  } catch (error) {
    console.error(error);
  }
}

仔細檢查下面列出的一些內容。

  1. 檢查數據庫中的用戶名並確保您在應用程序中使用了相同的用戶名。
  2. 檢查密碼。
  3. 檢查數據庫的 URl(如果任何字母不同或更改)。
  4. 如果網絡訪問部分的 IP 訪問列表中不存在您的 IP,請檢查網絡訪問。 (如果那里不存在,請添加您的 IP 地址或創建添加新的 IP 地址)。

通過以下方式添加新的 IP 地址:-> 點擊添加 IP 地址 -> 點擊允許從任何地方訪問 -> 點擊確認。

  1. 還要檢查,如果您在您公司的網絡上並將 IP 地址添加到 IP 訪問列表中,您可能會遇到同樣的問題,如果是這樣,請嘗試切換到您的移動互聯網或公司網絡以外的其他網絡。

現在,運行應用程序。

檢查以上所有要點並使其正確已為我解決了問題。 希望你也一樣。 :)

提及您的數據庫名稱 dbname -> yourDbName without < > 這將解決您的問題

URI=mongodb+srv://<username>: 
<password>@cluster0.swye5.mongodb.net/<dbname>?retryWrites=true&w=majority

我最近遇到了類似的問題,我認為錯誤是

需要('dotenv').config()

改成這個

需要('dotenv/config')

或者

需要('dotenv')

導入 package 后,調用配置 function

dotenv.config()

此錯誤可能是由用戶屬性中的拼寫錯誤引起的。 (我試圖設置“電子郵件”而不是在我的用戶 model 上定義的內容:“電子郵件”)。

我遇到了同樣的問題。 但是我的 MongoDB 在我的機器上本地運行。 在將查詢發送到數據庫之前,我忘記打開連接。 所以,我添加了打開和關閉連接的代碼,它工作了。

 try{ await mongoose.connect(uri); // My mongoose database request code } finally{ await mongoose.connection.close(); }

我遇到了同樣的問題,我刪除useCreateIndex: true ,並且只使用了:

{
  useNewUrlParser: true
}

所以我遇到了同樣的錯誤,但就我而言,原因是因為我使用了mongoose.createConnection(...)方法而不是mongoose.connect(...)方法。

兩者之間的相關區別在於,使用mongoose.connect時,創建的連接會在您執行mongoose.model('User', userSchema)時自動鏈接到您的貓鼬模型。 但是,對於mongoose.createConnection ,您需要像這樣直接將它與您的模式鏈接起來:

import * as mongoose from 'mongoose'
import { userSchema } from '../path/to/your/schema'

const dbURL = 'mongodb://localhost:27017'
const db = mongoose.createConnection(dbURL, {dbName: 'my-db-name'})

export const User = db.model('User', userSchema)

重要的一點是在最后一行,我們使用創建的連接實例db來創建我們的模型,而不是直接使用mongoose.model

請記住,此解決方案僅在您使用mongoose.createConnection而不是mongoose.connect時才相關

創建新的數據庫用戶為我工作。

我關閉了我的移動熱點並重新打開並且它起作用了。

暫無
暫無

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

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