【问题标题】:The `uri` parameter to `openUri()` must be a string, got "undefined"`openUri()` 的 `uri` 参数必须是字符串,得到“未定义”
【发布时间】:2019-08-11 13:03:47
【问题描述】:

我对此进行了很多搜索,但没有一个可以帮助我。

当我运行我的项目时,我得到了这个错误:

/home/ali/Desktop/personalitytest-backend/node_modules/mongoose/lib/connection.js:428 throw new MongooseError('openUri()uri 参数必须是' + ^ MongooseError:openUri()uri 参数必须是字符串,得到“未定义”。确保第一个参数 mongoose.connect()mongoose.createConnection() 是一个字符串。

我的 index.js 文件:

const express = require('express'),
  app = express(),
  mongoose = require('mongoose'),
  rateLimit = new require('express-rate-limit')({
    windowMs: 1000 * 60 * 10,
    max: 500,
    handler: (req, res) => {
      res.json({
        data: 'Your request was too much, please try again in 10 minutes later.',
        status: 'error'
      })
    }
  });
const Application = new class {
  constructor() {
    this.setConfig();
    this.setupDB();
    this.setRouters();
    this.setupExpress();
  }
  setConfig() {
    require('dotenv').config();
    app.use(require('helmet')());
    app.use(express.json());
  }
  setupDB() {
    mongoose.Promise = global.Promise;
    mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true, useCreateIndex: true });
  }
  setRouters() {
    app.use('/', require('./routes'));
  }
  setupExpress() {
    app.listen(process.env.PORT, () => console.log(`Listening on port ${process.env.PORT}.`));
    // app.listen(process.env.PORT, process.env.IP, () => console.log(`Listening on port ${process.env.PORT}.`));
  }
}

我的 .env 文件:

PORT=3000
DATABASE_URL=mongodb://localhost:27017/PersonalityTest
JWT_SECRETKEY=asfdawetq312etr%!@$qe

如果我只是简单的在mongoose.connect方法中写数据库url就不会报错。

例如,这没有错误:

mongoose.connect("mongodb://localhost:27017/PersonalityTest", { useNewUrlParser: true, useCreateIndex: true });

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

    要读取.env-文件,您需要安装一些可以读取该文件的东西,例如dotenv

    npm install dotenv --save
    

    那你require that package in your code

    require('dotenv').config();
    

    根据dotenv 文档,您应该这样做

    尽早在您的应用程序中要求并配置 dotenv。

    接下来,您可能需要在 DATABASE_URL 值周围添加双引号

    DATABASE_URL="mongodb://localhost:27017/PersonalityTest"
    

    【讨论】:

    • 我做了所有的项目,但没有得到结果,仍然有错误。
    • 我认为问题在于需要 env 包。
    • 根据dotenv 文档,您应该在您的应用程序中尽早添加require('dotenv').config();“[a},需要并配置dotenv”。我从来没有见过任何人使用 require 你在这里做的方式。试着把它放在你的 index.js 文件的顶部
    【解决方案2】:

    在我的例子中,我在 config 后面省略了括号。所以正确的配置如下。现在没有更多错误了。

    require('dotenv').config()

    【讨论】:

    • 在这种情况下,我们可以看到用户并没有忘记括号。但如果问题缺少一组(),则将被视为错字。如果出现拼写错误,请帮助 OP,但更正应作为 Comment 留在帖子中,而不是作为 Answer。还要知道,Q 将作为题外话、错字或对未来用户没有帮助而“关闭”。如果您愿意,您甚至可以自己将帖子标记为拼写错误。 (顺便说一句,括号是[],括号是(),大括号是{})。
    【解决方案3】:

    我遇到了这个错误,很有趣,我有另一个项目使用了类似的设置。进入那个项目并使用相同的 .env 值启动它,它没有任何问题。

    所以我复制了当前项目的代码并启动了当前项目,但如果我有这样的设置,我不想连接到 mongodb mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true },

    只有当我像这样使用它时才会起作用mongoose.connect("mongodb://localhost:3000/posts", { useNewUrlParser: true, useCreateIndex: true });

    困扰我的是它在一个项目中有效,但在另一个项目中无效,所以我决定删除我的 node_modules 文件夹和 package-lock.json 文件并重新安装所有内容。

    之后一切正常。

    还要检查您是否没有另一个与当前文件夹冲突的 node_modules 文件夹。如果是这样,请删除您的 package-lock.json 文件并重新安装。确保您也在正确的目录中。

    【讨论】:

      【解决方案4】:

      您是否检查过您的 .env 变量是否可以从该 index.js 文件中读取?

      例如,查看将其中一些记录到控制台时得到的结果:

      console.log(process.env.DATABASE_URL);
      

      如果您得到“未定义”,那么您可以尝试为您的 .env 文件指定绝对路径,如下所示:

      const path = require('path');
      require('dotenv').config({ path: path.resolve(__dirname, './.env') });
      

      我最近遇到了这个问题,在我的情况下解决了这个问题。问候。

      【讨论】:

        【解决方案5】:

        从 routes 文件夹或任何其他文件夹中移动 .env 文件。并且不要将它放在任何特定文件夹中,只需将其放在主文件夹中,就像 app.js 或 index.js 一样,无论您拥有什么。这可能行得通!

        【讨论】:

          【解决方案6】:

          确保 .env 文件名为 .env 而不是 config.env 或其他任何名称。
          我通过在线学习教程遇到了这个问题,直到最近才弄清楚为什么会出现这个错误。

          file structure

          console output

          【讨论】:

          • 欢迎来到 SO。仅供参考,所有错误消息、代码、数据等都必须嵌入为文本,而不是文本图像,不能复制粘贴到搜索引擎或代码编辑器中。文本图像也可能难以阅读,尤其是在移动设备上,并且也可能在移动设备上消耗过多的数据。请edit 提出指导方针。最后,这读起来更像是评论而不是答案,因此平台可能会将其删除为“不是答案”。一旦你有足够的代表,你可以在任何地方留下评论。您可以在 StackOverflow.com/help 上阅读有关 SO 指南的更多信息。期待更多见解
          • 这实际上解决了我的问题。不知道为什么我的 .env 文件被删除了。感谢您的回答!
          【解决方案7】:

          我知道问题出在哪里。
          确保首先编写 dotenv.config({path: './config.env'});然后你使用你的 process.env.DATABASE_URL
          不要在 dotenv.config({path:'./config.env'}); 之前使用 process.env.DATABASE_URL;

          【讨论】:

            【解决方案8】:

            你必须在安装 dotenv 包后声明.env 文件。

            【讨论】:

            • 这成功了!!!谢谢!
            【解决方案9】:

            参考github仓库: https://github.com/realabbas/serverless-lambda-node-express-mongodb

            扩展 oxk4r 的答案,我有以下树显示应用程序的目录结构:

            .
            ├── code-of-conduct.md
            ├── .env
            ├── .gitignore
            ├── _config.yml
            ├── contributing.md
            ├── lib
            │   ├── app.js
            │   ├── db.js
            │   └── routes
            │       ├── index.js
            │       └── notes
            │           ├── note.js
            │           └── notes.controller.js
            ├── LICENSE
            ├── package.json
            ├── package-lock.json
            ├── README.md
            ├── secrets.json
            ├── server.js
            └── serverless.yml
            

            我们主要使用 dotenv 包来引用 .env 文件中的环境变量。 这里要注意的重要一点是 db.js 和 .env 文件。我们需要从 db.js 文件中引用 .env 文件。我们这样做:

            db.js

            const path = require('path');
            const mongoose = require('mongoose')
            require('dotenv').config({ path: path.resolve(__dirname, '../.env') });
            console.log('here...', path.resolve(__dirname, '../.env'), process.env.MONGODB_URL)
            
            mongoose.connect(process.env.MONGODB_URL
               , { useNewUrlParser: true })
            

            .env

            MONGODB_URL="mongodb://127.0.0.1:27017/game-of-thrones"
            

            正如我们看到的树,.env 文件 id 比 db.js 文件高一级。因此,我们通过路径包将其引用为:

             path.resolve(__dirname, '../.env')
            

            【讨论】:

              【解决方案10】:

              这对我有用

              const dotenv = require('dotenv')
              dotenv.config({path:__dirname+'/.env'});
              

              【讨论】:

                【解决方案11】:

                我遇到了同样的问题,即使按照此处说明的所有内容,它仍然存在。直到我翻阅 .env 并意识到我输入了 DB_NAME:mongodb+srv:/.....,将其更改为 DB_NAME=mongodb+srv:/..... 并且变量不再未定义,Mongoose 能够读取它。

                【讨论】:

                  【解决方案12】:

                  在您的应用设置下的 Heroku Config Vars 中检查您的键和值。看起来很傻,但我用的是 MONGODB_URL 而不是 _URI,我花了很长时间才意识到自己的错误。

                  【讨论】:

                    【解决方案13】:

                    说: require('dotenv').config(); 在所有其他“要求”所在的文件顶部。 然后在变量中添加process.env.DATABASE_URLconst source = process.env.DATABASE_URL;

                    因此在文件的顶部您将拥有:

                    require ('dotenv'). config ();
                    const source = process.env.DATABASE_URL;
                    

                    下:

                    mongoose.connect (source, {useNewUrlParser: true});
                    

                    【讨论】:

                      猜你喜欢
                      • 2021-05-22
                      • 2021-03-24
                      • 2021-05-21
                      • 2021-06-17
                      • 2019-10-05
                      • 2023-02-11
                      • 1970-01-01
                      • 2023-03-31
                      • 2022-11-16
                      相关资源
                      最近更新 更多