尝试连接Mongo DB时出现Mongoose错误

3
所以我的问题是,我正在尝试将我的应用程序连接到Mongo DB集合/数据库,但它无法连接。我在.env文件中有我的连接字符串和端口号,然后我将其导入到我的app.js文件中,在那里我尝试建立连接。
控制台日志中的错误:
throw new MongooseError('The `uri` parameter to `openUri()` must be a ' +
^
Error [MongooseError]: The `uri` parameter to `openUri()` must be a string, got "undefined". Make 
sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string.

.env 文件:

MONGO_URI=mongodb+srv://Admin:<Password>@cluster0-3t4ed.mongodb.net/test?retryWrites=true&w=majority
PORT=3000

app.js文件:

const express = require("express");
const app = express();
const mongoose = require("mongoose");
const morgan = require("morgan");
const dotenv = require("dotenv");
dotenv.config();

数据库:

mongoose.connect(process.env.MONGO_URI).then(() => {
  console.log("DB Connected");
});

mongoose.connection.on("error", err => {
 console.log(`DB Connection Error: ${err.message}`);
});

我已经将连接字符串用引号括起来了,但它仍然无法工作。

我已经联系过MongoDB支持,但他们不能为我提供帮助。

如果您有任何建议,将非常有益。


对于你的 .env 文件:mongodb://username:password@localhost:portnum/dbName <- 你得到了什么? - undefined
我得到了和之前一样的错误 - undefined
9个回答

3

您收到此消息是因为在调用mongoose.connect(process.env.MONGO_URI)时,MONGO_URI未定义。

解决方法是尽早在应用程序中调用dotenv.config()(请参见 dotenv文档)。

// app.js
require("dotenv").config();
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const morgan = require("morgan");

我刚刚尝试了那个选项,不幸的是,我仍然得到相同的错误... - undefined
请确保.env文件位于您项目的根目录(与package.json文件同级),或者将其路径配置到dotenv的config()函数中。同时,请确保重新启动您的Node.js服务器,即使您正在使用nodemon。 - undefined

0
connect中,传递参数的方式是错误的。 我认为这样会起作用。 尝试一下这段代码。
connect(`${process.env.MONGO_URL}`).then => () ~~ 

你的代码中有3个sprocesss - undefined

0
我也曾经遇到过这个问题,你需要考虑以下几点:
1. 如果"app.js"在服务器端文件夹中与客户端文件夹不同,那么请在服务器端文件夹中(与"app.js"文件所在的文件夹相同)创建".env"文件。
2. 如果没有文件或文件夹的分离,请确保在"app.js"文件中尽早引入"require("dotenv").config();"。

0

这个问题已经通过以下方式解决:

  1. 将.env文件放在项目的根目录中,与package.json文件位于同一目录下。
  2. 如果在部署(比如Heroku)时出现了这个问题。在Heroku上,它会查找在Heroku中声明的环境变量。只需按照以下步骤操作:
  3. 进入仪表盘,在所选应用程序中转到设置选项卡。
  4. 进入Config vars并点击“reveal vars”。
  5. 只需在键和值对中添加您的.env变量。
  6. 例如,将MONGO_URI放在键中,mongodb+srv://Admin:@cluster0-3t4ed.mongodb.net/test?retryWrites=true&w=majority放在值中。 就这样,您就可以部署您的应用程序,包括您的.env变量。

0
检查一下你的代码中是否调用了两次不同URI的mongoose.connect。这就是我的情况。

0
这个问题在这里得到了解决。我尝试过了,它有效。如果你将数据库名称从test改为其他任何名称,你也可以考虑删除末尾的?retryWrites=true&w=majority

0

是的,我实际上已经弄清楚了,如果有人想知道的话。我进入了我的MongoDB设置,然后进入数据库访问,将我的当前IP地址添加到白名单中,似乎可以正常工作。

这可能也是我在连接代码中设置的一些有用的内容:

const options = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true,
  useFindAndModify: false,
  autoIndex: false,
  poolSize: 10,
  bufferMaxEntries: 0,
  connectTimeoutMS: 0,
  socketTimeoutMS: 0,
  family: 4
};
mongoose
  .connect(key.MONGO_URI, options)
  .then(() => console.log("MongoDB Connected..."))
  .catch(err => console.log(err));

在.connect方法中的'key'被保存在另一个文件中,我正在将其导入到这个文件中。


0

你可以尝试两件事情。

首先,不要使用mongoose,而是使用MongoDB模块。 你可以使用

require('MongoDB').client;

在你的.env文件中,第二点是确保你实际上将用户名和密码放入字符串中,或者确保不包含


<>

在你的代码中


0
    // Create .env file 
    inside .env 
    MONGO_URI=mongo+src://username:password@cluster0......majority
    //
   // Inside app.js or server.js 
    const dotenv = require('dotenv')
    dotenv.config()

    const mongoose = require('mongoose')

    mongoose.connect(process.env.MONGO_URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
    const db = mongoose.connection
    db.on('error', error => console.error(error))
    db.once('open', MONGO_URI => console.log('Connected to Database'))

1
欢迎来到SO社区,鼓励对代码进行解释以帮助回答问题。 - undefined
虽然这段代码可能回答了问题,但是提供关于它如何以及为什么解决问题的额外背景信息会提高答案的长期价值。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接