【问题标题】:What is MONGO_URL and what should it be set to?MONGO_URL 是什么,应该设置什么?
【发布时间】:2019-08-31 09:51:39
【问题描述】:

我从 GitHub 下载了一些代码,以便在我的机器上本地运行并使用它。这是第一次下载或使用 MongoDB。我按照说明从this website 下载了 MongoDB。然后我确保使用 sudo service mongod start 命令启动 MongoDB。

启动后,我使用node application.js 命令运行从 GitHub 下载的项目。我收到一个错误:

throw new MongooseError('The `uri` parameter to `openUri()` must be a ' +
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.

据我所见,我下载的代码有这样的连接语句:

mongoose.connect(process.env.MONGO_URL, { useNewUrlParser: true }, function (err) {
    if (err) {
        console.log("connection error:", err);
    } else {
        console.log("MongoDB connection successful");
    }
});

我似乎找不到MONGO_URL。做了一些谷歌搜索,我看到很多人提到流星,但我没有使用它。根据我收集到的信息,这是 MongoDB 用来连接到我的机器上运行的本地数据库的路径。然而,这并没有在项目的任何地方或安装过程中设置。

我的理解正确吗?听起来我需要在我的 Linux 机器上定义一个新的环境变量。这个变量应该设置成什么?我打算只在我的机器上运行这个项目以用于学习目的。

谢谢大家的帮助!

【问题讨论】:

  • mongodb://localhost:27017
  • 不幸的是,这不起作用,但它确实给了我一个关于数据库名称的有意义的错误,所以我不得不在该语句的末尾添加 /<db name>

标签: node.js mongodb express mean-stack


【解决方案1】:

mongoose.connection() 接受3 values

Connection.prototype.openUri = function(uri, options, callback) {
    …
};

throw new MongooseError('openUri()uri 参数必须是' + MongooseError: openUri()uri 参数必须是字符串,得到“未定义”。确保mongoose.connect()mongoose.createConnection() 的第一个参数是字符串

正如您的错误消息所暗示的,您传递的 uri 原来是 undefined。如果您不重视它,就会发生这种情况。

您能否记录process.env.MONGO_URL 的值并查看该值。

console.log(‘Connection url => ’, process.env.MONGO_URL);

由于您已经安装了 mongo db,默认情况下它将在 mongodb://localhost:27017 url 中运行。

您可以考虑将诸如环境值之类的值传递给您,而不是对连接 url 进行硬编码

如果你只有一个环境值,你可以将它与安装一起传递

MONGO_URL=mongodb://localhost:27017 node index.js 

如果每个应用程序有超过 2-3 个环境变量或多个应用程序都使用环境变量,它会很快用太多的值污染你的环境。您可以使用dotenv 使用.env 文件配置它们

安装dotenv。在项目根目录下创建.env文件和ignore it in .gitignore

.env

MONGO_URL=mongodb://localhost:27017

在您的代码中,

const dotenv = require('dotenv').config();
console.log(process.env.MONGO_URL); //you can access it straight way

我们正在向stricly separate config from code 这样做,这将有助于我们避免将敏感细节签入 GitHub

你可以看看a sample project,我上面有configured的详细信息。

【讨论】:

  • 我在上面提到的函数中硬编码了路径。您提到默认情况下,如果安装了 mongodb,它应该运行。正如怀疑的那样,process.env.MONGO_URL 的控制台日志是未定义的。应该在何时何地定义?因为我使用原始帖子中提到的步骤安装了 mongodb。
  • 如果你使用MONGO_URL=mongodb://localhost:27017 node index.jsprocess.env.MONGO_URL 将被设置为mongodb://localhost:27017。这是因为 mongodb 在 localhost 的 27017 端口运行
  • 明白。我会在哪里设置这个?我是否必须将其添加到我的 Linux 环境变量中?
  • @MB41 在我的一个示例项目中添加了位置和方式的详细信息 :)
【解决方案2】:

如果您的数据库在本地机器上,那么您需要这样做,

mongoose.connect('mongodb://localhost:27017/myapp', {useNewUrlParser: true});

如果在您的机器上连接失败,请尝试使用 127.0.0.1 而不是 localhost。

【讨论】:

  • 谢谢。但是这些环境变量应该在下载 MongoDB 时设置吗?因为我看到与process.env.SESSION_SECRET 相同的问题。
  • 你必须设置你自己的环境变量
【解决方案3】:

查看我的回答HERE,我正在使用jest-mongodb,而我的问题是尝试在globalSetup 中使用尚未初始化的环境变量..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2015-03-08
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多