我对此进行了很多搜索,但没有一个能帮助我。
运行项目时,出现此错误:
/home/ali/Desktop/personalitytest-backend/node_modules/mongoose/lib/connection.js:428 抛出新的MongooseError('
uri
的{{1}}参数必须是'+ ^ MongooseError:openUri()
的{{1}}参数必须为字符串,且未定义。确保第一个参数为uri
或openUri()
是一个字符串。
我的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}.`));
}
}
答案 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
或其他任何名称。
我在在线学习教程时遇到了这个问题,直到最近才弄清楚为什么我会遇到这个错误。
答案 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'});