mongoose.connect(),第一个参数应该是字符串,接收未定义

mongoose.connect(), first argument should be String, received undefined

我正在尝试为测试目的设置测试数据库,但它不起作用。

我正在尝试使用 mongoose 连接到 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"
    }
}

感谢您的帮助!

我想你错过了导入 env 文件。

require('dotenv').config({ path: 'ENV_FILENAME' });

在 mongoose.connect() 方法中添加代码 { useNewUrlParser: true } 后,我也遇到了同样的问题。问题已解决。

mongoose.connect(config.DB,{ useNewUrlParser: true }));

我有一个类似的问题,已通过添加此代码片段解决。

mongoose.connect(config.DB,{ useMongoClient:true });

确保您的 .env 文件中定义了您正在使用的常量。

这就是解决了我的问题。编码愉快!

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

由于错误消息返回了 UNDEFINED uri 参数,.toString() 将不起作用。 您可以使用 String() 函数:String(your connection parameter).
另外,在if(env === 'test' || env === 'development')中尽量不要使用(===),是严格相等。

改为尝试 if(env == 'test' || env == 'development')。这是一个松散的平等。它不关心类型匹配,并将第二个操作数的类型转换为第一个操作数的类型。

我遇到了同样的问题,但后来我意识到我将 .env 文件保存为 .env.txt 导致了这个问题。我删除了该文件并创建了另一个末尾没有 .txt 的文件,一切正常。

希望对您有所帮助。

Dhiya Aljaradi

要从 .env 文件读取你必须安装 dotenv ( npm i dotenv / yarn add dotenv) 然后将其添加到您的文件之上。


const dotenv = require("dotenv");

dotenv.config();

MongooseError: openUri()uri 参数必须是字符串,得到 "undefined"。确保 mongoose.connect()mongoose.createConnection() 的第一个参数是一个字符串。

我运行遇到了同样的问题。 1. 我将我的 ATLAS_URI ID 保存到一个名为 .env 的文件中 2. 我的 .env 文件在 错误的目录 中,这就是问题的原因 3. 解决方案:我使用 "ls -a" 命令来确保我的 .env 文件与我的服务器位于同一位置

我有同样的错误,对我来说这是因为我试图在 globalSetup 中使用环境变量,其中有用于启动数据库连接的文件.. mongoose.connect(global.__MONGO_URI__

显然,globalSetup 中的环境变量尚未初始化,所以我不得不将代码移到其他地方,或者移至 setupFilesAfterEnv 或使用 Async Test Environment

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

只需更改环境

const db = process.env.MONGO || 'test'

如果您忘记了 import/require dotenv,那么您可以 运行 在 运行 使用 --require dotenv/config

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 和调用配置函数。享受吧!

我做错了什么是我创建了 js 文件来存储密钥:

module.export = {
MONGOURI : "Your Key"
}

并且从我的 app.js 中获取具有不同键名的键,例如

const {MongoUri} = require('./keys')

将 MongoUri 更改为 MONGOURI 后,它工作正常。

如果我们不想这样定义.env文件的路径,

require('dotenv').config({ path: 'ENV_FILENAME' });

我们可以将 .env 文件放在与主文件相同的位置,在我的例子中是 App.js。所以我们可以直接写

require('dotenv').config()

const conn = await mongoose.connect(process.env.MONGO_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useCreateIndex: true
    })

始终在放置 useUnifiedTopology:true 之前放置 useNewUrlParser:true,然后放置其余部分。

我遇到了同样的错误,这个线程没有帮助...这是我的解决方案,很简单!我正在使用 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() 表达式之后。 就是这样! :)

我遇到了同样的问题,这是我的解决方法: 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
};

我的 .env 文件被错误地命名为 .dotenv。 将其更改为 .env 后一切正常

在服务器目录中,

  1. npm install dotenv
    
  2. 在您的 server.js 中: 如果您在 package.json 文件中使用 "type":"module" 那么,

    import dotenv from 'dotenv';
    import mongoose from 'mongoose'; 
    dotenv.config();
    

    或者,

    const mongoose = require('mongoose')
    require('dotenv').config()
    
  3. 在服务器目录下添加一个.env文件,

    PORT=5000
    MONGO_URL= yourURL
    
  4. 在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)
    

我收到了这个错误信息,你必须在安装dotenv包后声明.env文件。如果你在安装包之前声明文件,变量将是未定义的

我有一个类似的问题,请确保您在“/”中有 .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' })

使用后 要求(“dotenv”).config();或从“dotenv”导入dotenv; dotenv.config();将您的 .env 文件放在与服务器文件相同的文件夹中

试试这个对我有用的方法。

mongoose.connect(`${process.env.MONGO_URL}`, {useNewUrlParser: true, useUnifiedTopology: true}, ()=>{
    console.log("mongodb is connected")
});

有一个很小的错误你的 .env 文件应该存在于你的项目目录中。也许您的 .env 文件放在不同的文件夹中。检查您的 .env 文件位置

您可以检查您文件夹中的“.env”文件是否有正确的名称,否则将无法正常工作。 如果您将“.env”文件命名为其他名称,请更改它。

请尝试以下步骤

第 1 步 - 安装 dotenv 包

# with npm
npm install dotenv

# with Yarn
yarn add dotenv

第 2 步 - 创建一个新的 env 文件,例如 config.env

第 3 步 - 在 config.env 文件中写入以下代码

DATABASE = MONGO_URL
PORT = port_number

第 4 步 - 在您的主服务器文件中写入以下代码(在我的例子中是 index.js)

const dotenv = require("dotenv");  //require dotenv package
dotenv.config({ path: "./config.env" }); //import config.env file

const DB = process.env.DATABASE;  
const Port = process.env.PORT;

mongoose
  .connect(DB, {
    usenewurlparser: true,
    useunifiedtopology: true,
  })
  .then(() => {
    console.log("Successfully connected ");
  })
  .catch((error) => {
    console.log(`can not connect to database, ${error}`);
  });

我遇到了同样的问题。我轻松解决了。

  • 第一步:npm 安装 dotenv
  • 第 2 步:要求('dotenv').config()
  • 第 3 步:创建 .env 文件
  • 第 4 步:将点 env (.env) 文件推入此代码 DB_USER = ********* 和 DB_PASS = *********
  • 第 5 步:

const dbURL = mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@techbd71.5ewxj.mongodb.net/输入 table 名字在这里?retryWrites=true&w=majority

mongoose.connect(dbURL, {useNewUrlParser: true, useUnifiedTopology: true})
  .then(()=>console.log('DB Ok'))
  .catch(err => console.log(err))
Also, make sure to call dotenv at the top of the code.
The following code gives you the above error as you mentioned above  
// Connecting to DataBase    
        connectDB();    
        const dotenv = require('dotenv').config();    
The Correct Way  
        const dotenv = require('dotenv').config();    
        // Connecting to DataBase    
        connectDB();