openUri()的uri参数必须为字符串,且未定义

时间:2019-03-20 18:06:52

标签: javascript node.js mongoose

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

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

  

/home/ali/Desktop/personalitytest-backend/node_modules/mongoose/lib/connection.js:428           抛出新的MongooseError('uri的{​​{1}}参数必须是'+           ^       MongooseError:openUri()的{​​{1}}参数必须为字符串,且未定义。确保第一个参数为   uriopenUri()是一个字符串。

我的index.js文件:

mongoose.connect()

我的.env文件:

mongoose.createConnection()

如果我只用mongoose.connect方法编写数据库URL,就不会有错误。

例如,这没有错误:

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}.`));
  }
}

10 个答案:

答案 0 :(得分:6)

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

例如,当你将其中的一些记录到控制台时,看看你得到了什么:

console.log(process.env.DATABASE_URL);

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

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

我最近遇到了这个问题,就我而言,它解决了这个问题。问候。

答案 1 :(得分:1)

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

因此,我将代码复制到当前项目中并启动了当前项目,但是如果我将其设置为mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true },,则不想连接到mongodb

,并且只有在我像这样mongoose.connect("mongodb://localhost:3000/posts", { useNewUrlParser: true, useCreateIndex: true });

的情况下才能使用

困扰我的是,它只能在一个项目中工作,而不能在另一个项目中工作,所以我决定删除node_modules文件夹和package-lock.json文件,然后重新安装所有内容。

此后一切正常。

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

答案 2 :(得分:1)

从 routes 文件夹或任何其他文件夹中移动 .env 文件。并且不要把它放在任何特定的文件夹中,让它像 app.js 或 index.js 一样放在主文件夹中。这可能有用!

答案 3 :(得分:1)

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

答案 4 :(得分:0)

要读取.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"

答案 5 :(得分:0)

就我而言,我在config一词后省略了方括号。因此,正确的配置如下。现在不再有错误。

require('dotenv')。config()

答案 6 :(得分:0)

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

file structure

console output

答案 7 :(得分:0)

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

答案 8 :(得分:0)

参考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 文件比 db.js 文件高一级。所以,我们通过路径包引用它:

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

答案 9 :(得分:0)

这对我有用

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