![](/img/trans.png)
[英]Error : The `uri` parameter to `openUri()` must be a string, got “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 值启动它,它没有任何问题。
因此,我将代码复制到当前项目上并启动了当前项目,但不想连接到 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_URL
: const 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}...`);
});
现在你面临的问题与config.env
的路径有关,检查你访问是否正确// console.log(process.env);
这样它就会显示您可以访问.env
,如果没有,那么您的路径-
require('dotenv').config({ path: path.resolve(__dirname, '../.env') });
现在再次console.log(process.env)
如果你在你的控制台中得到它,请阅读它们的属性在存在的config.env
文件中提到。
DATABASE
和DATABASE_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 处于同一级别的应用程序的根目录
.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.