我正在尝试出于测试目的设置测试数据库,但无法正常工作。
我正在尝试使用猫鼬连接到mongodb,但是在连接错误中发现问题:
throw new MongooseError('The `uri` parameter to `openUri()` must be a ' +
^
MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()`is a string.
at new MongooseError (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/node_modules/mongoose/lib/error/mongooseError.js:11:11)
at NativeConnection.Connection.openUri (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/node_modules/mongoose/lib/connection.js:424:11)
at Mongoose.connect (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/node_modules/mongoose/lib/index.js:230:15)
at Object.<anonymous> (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/server/db/mongoose.js:5:10)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/server/models/Todo.js:1:82)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/server/tests/server.test.js:4:16)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at /media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/node_modules/mocha/lib/mocha.js:250:27
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/node_modules/mocha/lib/mocha.js:247:14)
at Mocha.run (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/node_modules/mocha/lib/mocha.js:576:10)
at Object.<anonymous> (/media/abhigyan/ABHI/programming/node js/Practice/On my Own/Todo/node_modules/mocha/bin/_mocha:637:18)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
error Command failed with exit code 1.
我正在传递有效的字符串,但是它不起作用!
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect(process.env.MONGODB_URI, err => {
if(err)
console.log(err);
}
);
module.exports = {
mongoose
};
以下是运行mocha的脚本:
export NODE_ENV='test' && mocha server/**/*.test.js
这是配置代码:
const config = require('./config.json');
const env = process.env.NODE_ENV.toString() || 'development';
if(env === 'test' || env === 'development') {
const envConfig = config[env];
Object.keys(envConfig).forEach(key => {
process.env[key] = envConfig[key];
});
};
console.log(env);
这是config.json文件:
{
"test": {
"PORT": 3000,
"MONGODB_URI": "mongodb://localhost:27017/TodoTest"
},
"development": {
"PORT": 3000,
"MONGODB_URI": "mongodb://localhost:27017/Todo"
}
}
感谢帮助!
答案 0 :(得分:4)
在mongoose.connect()方法中添加代码 { useNewUrlParser: true }
后,我也面临着同样的问题。问题已解决。
mongoose.connect(config.DB,{ useNewUrlParser: true }));
答案 1 :(得分:3)
我认为您错过了导入env
文件的操作。
require('dotenv').config({ path: 'ENV_FILENAME' });
答案 2 :(得分:3)
我遇到了同样的问题。 1.我将ATLAS_URI ID保存到名为.env的文件中 2.我的.env文件位于错误的目录中,这就是导致问题的原因 3.解决方案:我使用“ ls -a”命令来确保我的.env文件与服务器位于同一位置
答案 3 :(得分:1)
我收到了这个错误信息,你必须在安装 dotenv 包后声明 .env 文件。如果在安装包之前声明文件,变量将是未定义的
答案 4 :(得分:1)
在服务器目录中,
npm install dotenv
在你的 server.js 中: 如果您在 package.json 文件中使用 "type":"module" 那么,
import dotenv from 'dotenv';
import mongoose from 'mongoose';
dotenv.config();
或者,
const mongoose = require('mongoose')
require('dotenv').config()
在服务器目录添加一个.env文件,
PORT=5000
MONGO_URL= yourURL
在 server.js 中,
const url = process.env.MONGO_URL
mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => app.listen(PORT, () => console.log("Server up and running!")
.catch((error) => console.log(error.message)
mongoose.set('useFindAndModify', false)
答案 5 :(得分:1)
由于错误消息返回了UNDEFINED uri参数,因此<form action="/contact" method="POST">
{% csrf_token %}
<input type="email" name="from_email" placeholder="Your email">
<textarea name="message" placeholder="Message...">
</textarea>
<input type="submit"/>
</form>
将不起作用。
您可以使用.toString()
函数:String()
。
另外,在String(your connection parameter)
中尝试不使用(===),这是严格的相等性。
尝试if(env === 'test' || env === 'development')
。这是一个松散的平等。它不在乎类型匹配,会将第二个操作数的类型转换为第一个操作数的类型。
答案 6 :(得分:1)
我遇到了相同的错误,该线程没有帮助...这是我的解决方案,很简单!我正在使用express,mongo,mongoose和dotENV
文件1 === db.js
import mongoose from 'mongoose';
const connectDB = async ()=>{
try{
const conn = await mongoose.connect(process.env.MONGO_URI,{
//must add in order to not get any error masseges:
useUnifiedTopology:true,
useNewUrlParser: true,
useCreateIndex: true
})
console.log(`mongo database is connected!!! ${conn.connection.host} `)
}catch(error){
console.error(`Error: ${error} `)
process.exit(1) //passing 1 - will exit the proccess with error
}
}
export default connectDB
文件2 = server.js
import express from 'express'
import dotenv from 'dotenv'
import connectDB from './config/db.js' // DB connection
import products from './data/products.js'
dotenv.config()
const PORT = process.env.PORT || 5000
const mode = process.env.NODE_ENV
const app = express()
connectDB() //this function connects us to the DB!!!
. . . more code…
>解决方案:connectDB()表达式必须位于dotenv.config()表达式之后。 就是这样! :)
答案 7 :(得分:0)
我有一个类似的问题,请确保您在“/”中有 .env(在您的 package.json 文件旁边)。如果不想在您的应用程序代码中要求和加载 dotenv 或仍然有问题运行您的服务器通过:
node -r dotenv/config your_script.js
。
否则,如果包含环境变量的文件位于其他位置,则必须使用路径模块:
常见js:require('dotenv').config({ path: '/custom/path/to/.env' })
ES:dotenv.config({ path: '/custom/path/to/.env' })
答案 8 :(得分:0)
我的.env
文件被错误命名为.dotenv
。
将其更改为.env
后,一切正常?
答案 9 :(得分:0)
我遇到了同样的问题,这是我的解决方法: process.env.MONGODB_URL应该在字符串中。 看看
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('process.env.MONGODB_URI', err => {
if(err)
console.log(err);
}
);
module.exports = {
mongoose
};
答案 10 :(得分:0)
const conn = await mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
})
始终先将useNewUrlParser:true
放在useUnifiedTopology:true
之前,然后再放置其余部分。
答案 11 :(得分:0)
如果我们不想这样定义.env文件的路径,
require('dotenv').config({ path: 'ENV_FILENAME' });
我们可以将.env文件放置在与主文件相同的位置,本例中为App.js。所以我们可以直接写
require('dotenv').config()
答案 12 :(得分:0)
我做错了什么是我创建了js文件来存储密钥:
module.export = {
MONGOURI : "Your Key"
}
并且从我的app.js中,我正在获取具有不同键名的键,例如
const {MongoUri} = require('./keys')
将MongoUri更改为MONGOURI后,它工作正常。
答案 13 :(得分:0)
如果您忘记了导入/需要dotenv,则可以在运行应用程序之前使用-require dotenv / config
来运行dotenv。node --require dotenv/config index.js // regular node command
// nodemon to restart application whenever a file gets changed
nodemon --require dotenv/config index.js
// integrate with babel-node if you're using latest JS features like import/export
nodemon --require dotenv/config index.js --exec babel-node
无需在代码库中要求dotenv和调用配置功能。享受吧!
答案 14 :(得分:0)
只需更改环境
const db = process.env.MONGO || 'test'
答案 15 :(得分:0)
const db = process.env.MONGO || 'test'
mongoose.connect(db, {
useNewUrlParser: true,
useUnifiedTopology:true,
useCreateIndex: true
}).then(()=>{
console.log("conected to mongodb");
}).catch(error => {
console.log("mongo error",error);
})
答案 16 :(得分:0)
我有同样的错误,对我来说是因为我试图在globalSetup
中使用环境变量,该变量具有用于启动数据库连接的文件。mongoose.connect(global.__MONGO_URI__
显然,环境变量尚未在globalSetup
中初始化,因此我不得不将代码移到其他地方,或者移至setupFilesAfterEnv
或使用Async Test Environment
答案 17 :(得分:0)
要读取.env文件,您必须安装dotenv(npm我dotenv / yarn添加dotenv) 然后只需将其添加到文件顶部即可。
const dotenv = require("dotenv");
dotenv.config();
答案 18 :(得分:0)
我遇到了同样的问题,但是后来我意识到我将.env文件另存为.env.txt,这导致了问题。我删除了文件,并在末尾创建了另一个不带.txt的文件,一切正常。
我希望这会有所帮助。
Dhiya Aljaradi
答案 19 :(得分:0)
这就是解决我的问题的原因。祝您编码愉快!
// Connect to MongoDB
mongoose.connect('mongodb://yourusername:yourpassword@ds121825.mlab.com:11025/yourmongodb', {useNewUrlParser: true});
mongoose.connection.once('open', function(){
console.log('Conection has been made!');
}).on('error', function(error){
console.log('Error is: ', error);
});
答案 20 :(得分:0)
请确保您具有已定义常量的.env文件。
答案 21 :(得分:0)
我有一个类似的问题,可以通过添加此代码段来解决。
mongoose.connect(config.DB,{ useMongoClient:true });
答案 22 :(得分:-2)
MongooseError:uri
的{{1}}参数必须是字符串,为“未定义”。确保openUri()
或mongoose.connect()
的第一个参数是字符串。