繁体   English   中英

`openUri()` 的 `uri` 参数必须是一个字符串,得到“undefined”

[英]The `uri` parameter to `openUri()` must be a string, got "undefined"

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

当我运行我的项目时,出现此错误:

/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 });

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

npm install dotenv --save

然后你在你的代码中需要那个包

require('dotenv').config();

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

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

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

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

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

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

console.log(process.env.DATABASE_URL);

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

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

我最近在这个问题上苦苦挣扎,就我而言,这解决了这个问题。 问候。

这对我有用

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

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

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

文件结构

控制台输出

我遇到了这个错误并且很有趣,我有另一个使用类似设置的项目。 去那个项目并使用相同的 .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文件删除两者并重新安装。 确保您也在正确的目录中。

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

放: 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});
const dotenv = require('dotenv');
dotenv.config({ path: './config.env' });

const DB = process.env.DATABASE.replace(
  '<PASSWORD>',
  process.env.DATABASE_PASSWORD
);

mongoose
  .connect(DB, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
  })
  .then((con) => {
    // console.log(con.connections);
    console.log('DB connection successful');
  });
 const port = process.env.PORT || 3000;
 app.listen(port, () => {
       console.log(`app running on port ${port}...`);
  });
  1. 现在你面临的问题与config.env的路径有关,检查你访问是否正确// console.log(process.env); 这样它就会显示您可以访问.env ,如果没有,那么您的路径-

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

现在再次console.log(process.env)如果你在你的控制台中得到它,请阅读它们的属性在存在的config.env文件中提到。

  1. 检查您的DATABASEDATABASE_PASSWORD的链接是否正确或转到 mongoDB Atlas 更改您的集群密码并再次尝试

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

参考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 文件。 我们这样做:

数据库.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 包将其引用为:

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

我遇到了同样的问题,即使遵循了此处所述的所有内容,它仍然存在。 直到我检查 .env 并意识到我输入了DB_NAME:mongodb+srv:/..... ,才将其更改为DB_NAME=mongodb+srv:/.....并且变量不再未定义,猫鼬能够阅读它。

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

mongoose.connect(process.env.MONGO_URI).then(() => {
    console.log('DB Conected...')
})

In my case while connecting to database, I wrote wrong spelling of MONGO_URI , I wrote MANGO_URI there (but in .env file I had given name as MONGO_URI), Please do check & correct it, I know it not proper solution but sometime we do such small mistakes.

确保您的 .env 文件也位于执行 nodemon 命令的同一路径中。 否则你将不得不像@oxk4r 的回答那样声明 .env 的路径

写的时候发现

dotenv.config();

mongoose.connect(process.env.LOCAL_MONGO);

我的问题解决了。

没有写在构造函数中。

从“dotenv”导入 dotenv;

dotenv.config();

或者

常量 dotenv = 要求(“dotenv”);

dotenv.config();

无需为数据库 url 添加“”

将 .env 文件更改为与 package.json 处于同一级别的应用程序的根目录

  1. 创建一个.env文件并在其中提供MONGOURI

例子:

MONGO_URI=mongodb+srv://<password>@cluster0.wlhevoe.mongodb.net/test

2.在index.js中,这样要求

const dotenv = require('dotenv')

dotenv.config({ path: './.env' }) // Here you must take care to provide the correct path of the .env file
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true })
  .then(() => console.log('DB Connection Successful'));

这对我有用。 谢谢

就我而言,我在 config 一词后省略了括号。 所以正确的配置如下。 现在没有更多错误了。

需要('dotenv').config()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM