在这个帮助下,我在 mongo shell 中创建了一个超级用户:在 mongo 中创建超级用户
user: "try1"
passw: "hello"
在 mongo cmd 中,我有 3 个数据库:'admin'、'myDatabase' 和 'local'。
现在我尝试使用此授权连接到名为“myDatabase”的数据库。
mongoose.connect('mongodb://try1:hello@localhost:27017/myDatabase');
但这就是我得到的错误:
名称:'MongoError',
消息:“身份验证失败。”,
好的:0,
errmsg: '身份验证失败。',
代码:18,
代码名称:'身份验证失败'}
猫鼬已断开连接
Mongoose 通过 ${msg} 断开连接
我几个小时前也遇到了同样的问题,最终我解决了。我的代码是:
mongoose.createConnection(
"mongodb://localhost:27017/dbName",
{
"auth": {
"authSource": "admin"
},
"user": "admin",
"pass": "password"
}
);
await mongoose.connect("mongodb://localhost:27017/db", {
poolSize: 10,
authSource: "admin",
user: "admin",
pass: "password",
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
});
除了@kartGIS,我还添加了一个选项以使连接代码尽可能完美。
mongoose.connect("mongodb://localhost:27017/databaseName", {
"auth": { "authSource": "admin" },
"user": "username",
"pass": "password",
"useMongoClient": true
});
语法:
await mongoose.connect('mongodb://username:password@host:port/database?authSource=admin');
示例:
await mongoose.connect('mongodb://myUser:myPassword@localhost:27017/myDataBase?authSource=admin');
Node.js
const Connect = async () => {
let url = "mongodb://localhost:27017/test_db";
try {
let client = await Mongoose.connect( url, {
poolSize: 10,
authSource: "admin",
user: "root",
pass: "root123",
useCreateIndex: true,
useNewUrlParser: true,
useUnifiedTopology: true
} );
log( "Database is connected!" );
} catch ( error ) {
log( error.stack );
process.exit( 1 );
}
}
Connect();
/etc/mongod.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 0.0.0.0
setParameter:
enableLocalhostAuthBypass: false
security:
authorization: enabled
数据库用户
use admin;
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
show users;
{
"_id": "admin.root",
"userId": UUID( "5db3aafd-b1fd-4bea-925e-8a4bfb709f22" ),
"user": "root",
"db": "admin",
"roles": [ {
"role": "userAdminAnyDatabase",
"db": "admin"
},
{
"role": "readWriteAnyDatabase",
"db": "admin"
}
],
"mechanisms": [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
我有同样的问题,通过删除 'authSource' 参数解决了
/* Not working */
mongoose.connect("mongodb://localhost:27017/test", {
"auth": { "authSource": "admin" },
"user": "admin",
"pass": "admin123",
"useMongoClient": true
});
/* Working */
mongoose.connect("mongodb://localhost:27017/test", {
"user": "admin",
"pass": "admin123",
"useMongoClient": true
});
在 Mongoose-v5.0.0 上测试。
这是猫鼬 6.7.0 的答案!用于 NUXT 3
.env 部分
MONGO_URI = "mongodb://localhost:27017/MyBeautifulDB"
MONGO_USERNAME = "mongoadmin"
MONGO_PASSWORD = "mystrongpassword"
数据库连接部分
import mongoose from 'mongoose';
export default async (_nitroApp) => {
const config = useRuntimeConfig();
mongoose.connect(config.MONGO_URI, {
maxPoolSize: 10,
authSource: "admin",
user: config.MONGO_USERNAME,
pass: config.MONGO_PASSWORD
})
.then(() => console.log('Connected to DB'))
.catch((e) => console.log(e));
}
nuxt.config.ts - 将数据库连接文件注册到配置。
export default defineNuxtConfig({
runtimeConfig: {
MONGO_URI: process.env.MONGO_URI,
},
nitro: {
plugins: ['@/server/db/index.ts']
}
})
使用上述答案时我得到了
MongoParseError: credentials must be an object with 'username' and 'password' properties
。 try {
await connect("mongodb://localhost:27017/dbname", {
auth: { username: "root", password: "example" },
authSource: "admin",
});
console.log("Connected to mongo db");
} catch (error) {
console.error("Error connecting to mongodb", error);
}
mongodb版本5.0.2
猫鼬 6.0.4
分别,如果您的
authSource
是数据库(示例中的“myDB”)本身,并且您尝试使用 ConnectionOption
dbName
,则必须匹配 authSource
。
await mongoose.connect('mongodb://localhost:27017,' {
dbName: 'myDB',
user: 'myUser',
pass: 'asldjaskdj'
);
会因错误而失败:
{
"msg": "Authentication failed",
"attr": {
"mechanism": "SCRAM-SHA-1",
"principalName": "myUser",
"authenticationDatabase": "admin",
"client": "...",
"result": "UserNotFound: Could not find user \"myUser\" for db \"admin\""
}
}
将
authSource: 'myDB'
添加到连接选项即可。示例:
await mongoose.connect('mongodb://localhost:27017,' {
dbName: 'myDB',
authSource: 'myDB',
user: 'myUser',
pass: 'asldjaskdj'
);
我也有同样的问题。我正在使用较旧的 MongoDB 实例。我只是将
authSource=admin
添加到连接字符串中,就解决了问题。
根据最新的文档,应该是这样的:
mongoose.connect("mongodb://localhost:27017/databaseName", {
"user": "username",
"pass": "password",
"authSource": "databaseName" // users are scoped to DBs
});
在猫鼬上测试
6.x.x
对我有用。我使用本地数据库,mongoose 版本 6.9.1
.env 文件:
DB_HOST=127.0.0.1:27017
DB_NAME=blabla
DB_USER=blablabla
DB_PWD=blablablabla
js文件:
const DB = `mongodb://${process.env.DB_HOST}/${process.env.DB_NAME}`;
mongoose
.connect(DB, {
authSource: 'admin',
user: process.env.DB_USER,
pass: process.env.DB_PWD,
})
.then(() => {
console.log('Connected to database.');
})
.catch((err) => {
console.log(err.message);
});
注意 这个答案不是回答原来的问题,而是试图使用 NestJS 帮助处于类似情况的人
NestJS
@Module({
imports: [
MongooseModule.forRoot(
'mongodb://mongo:27017/test',
{
auth: {
username: 'root',
password: 'test',
},
authSource: 'admin',
},
),
],
})
export class AppModule {}
它帮助我在选项中写下我需要的所有内容:
等待 mongoose.connect("mongodb://localhost:27017", { 用户:“根”, 通过:“秘密”, 数据库名称:“motos”, });
我也遇到了同样的问题,但用这个解决了 猫鼬.connect(
mongodb://${dbUser}:${dbPwd}@${dbHost}:${dbPort}/userInfo?authSource=admin
)。假设您在 mongodb 中设置了身份验证。