【问题标题】:mongoose.connect(), first argument should be String, received undefinedmongoose.connect(),第一个参数应该是字符串,收到未定义
【发布时间】:2019-01-17 03:22:25
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

    标签: javascript node.js mongoose mocha.js


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      
      const dotenv = require("dotenv");
      
      dotenv.config();
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              在服务器目录中,

              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)
                

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                • 男人!你刚刚做到了。谢谢
                【解决方案8】:

                这就是解决我的问题的方法。快乐编码!

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

                【讨论】:

                  【解决方案9】:

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

                  我希望这会有所帮助。

                  Dhiya Aljaradi

                  【讨论】:

                    【解决方案10】:
                    const conn = await mongoose.connect(process.env.MONGO_URI, {
                          useNewUrlParser: true,
                          useUnifiedTopology: true,
                          useCreateIndex: true
                        })
                    

                    始终在输入useUnifiedTopology:true 之前输入useNewUrlParser:true,然后再输入其余部分。

                    【讨论】:

                      【解决方案11】:

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

                      【讨论】:

                        【解决方案12】:

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

                        【讨论】:

                          【解决方案13】:

                          我有一个类似的问题,通过添加此代码 sn-p 修复。

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

                          【讨论】:

                            【解决方案14】:

                            确保您拥有已定义您正在使用的常量的 .env 文件。

                            【讨论】:

                              【解决方案15】:

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

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

                              【讨论】:

                                【解决方案16】:
                                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);
                                    })
                                

                                【讨论】:

                                  【解决方案17】:

                                  只需更改环境

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

                                  【讨论】:

                                    【解决方案18】:

                                    如果您忘记导入/需要 dotenv,那么您可以在运行应用程序之前运行 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 和调用配置函数。享受吧!

                                    【讨论】:

                                      【解决方案19】:

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

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

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

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

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

                                      【讨论】:

                                        【解决方案20】:

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

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

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

                                        require('dotenv').config()
                                        

                                        【讨论】:

                                          【解决方案21】:

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

                                          【讨论】:

                                            【解决方案22】:

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

                                            【讨论】:

                                              【解决方案23】:

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

                                              【讨论】:

                                                【解决方案24】:

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

                                                【讨论】:

                                                  【解决方案25】:

                                                  尝试使用这种方法对我有用。

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

                                                  【讨论】:

                                                    【解决方案26】:

                                                    您可以检查文件夹中的“.env”文件是否具有确切的名称,否则它将不起作用。 如果您已将“.env”文件命名为其他名称,请更改它。

                                                    【讨论】:

                                                      【解决方案27】:

                                                      请尝试以下步骤

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

                                                      【讨论】:

                                                        【解决方案28】:

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

                                                        • 第 1 步:npm 安装 dotenv
                                                        • 第 2 步:require('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/enter 这里的表名?retryWrites=true&amp;w=majority

                                                        mongoose.connect(dbURL, {useNewUrlParser: true, useUnifiedTopology: true})
                                                          .then(()=>console.log('DB Ok'))
                                                          .catch(err => console.log(err))
                                                        

                                                        【讨论】:

                                                          【解决方案29】:
                                                          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();    
                                                          

                                                          【讨论】:

                                                            【解决方案30】:

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

                                                            【讨论】:

                                                            • 请用英文写:-)
                                                            猜你喜欢
                                                            • 2021-09-13
                                                            • 2023-03-31
                                                            • 2023-01-20
                                                            • 1970-01-01
                                                            • 1970-01-01
                                                            • 1970-01-01
                                                            • 2018-04-16
                                                            • 1970-01-01
                                                            • 2020-08-16
                                                            相关资源
                                                            最近更新 更多