mongoose.connect(),第一个参数应为String,未定义

时间:2018-08-09 15:23:49

标签: mongoose mocha

我正在尝试出于测试目的设置测试数据库,但无法正常工作。

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

感谢帮助!

23 个答案:

答案 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)

在服务器目录中,

  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)
    

答案 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()

enter image description here

答案 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__

enter image description here

显然,环境变量尚未在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()的第一个参数是字符串。