MongoServerError: bad auth :Authentication Failed - mongodb

Geeting This Error
const uri = `mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}#cluster0.agq2x.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`;
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

Related

Can't connect to mongodb Atlas with typeorm

I'm trying to connect to a MongoDB Atlas database with typeORM in an express project but I'm getting a 'Unescaped slash in userinfo section' error. My password doesn't have any special characters that need to be encoded so I don't know what's going on.
import { DataSource } from "typeorm"
export const AppDataSource = new DataSource({
type: "mongodb",
host: "mongodb+srv://username:password#database.cluster.mongodb.net/?retryWrites=true&w=majority",
useNewUrlParser: true,
synchronize: true,
useUnifiedTopology: true,
logging: true,
ssl: true,
entities: [
"src/entity/*.ts"
],
subscribers: [],
migrations: [],
})
"use strict";
import express from "express";
import cors from 'cors';
import "reflect-metadata";
import { AppDataSource } from "./data-source";
AppDataSource.initialize().then(() => {
const app = express();
app.use(cors({
origin: ['http://localhost:3000'],
credentials: true // this will allow cookies to be sent accross domains
}));
app.listen(8080, () => {
console.log("Server is running on port 8080");
})
})
the error I'm getting :
return callback(new MongoParseError('Unescaped slash in userinfo section'));
^
MongoParseError: Unescaped slash in userinfo section
at parseConnectionString (D:\Personal\jamboit\backend\node_modules\mongodb\lib\core\uri_parser.js:627:21)
at connect (D:\Personal\jamboit\backend\node_modules\mongodb\lib\operations\connect.js:283:3)
at D:\Personal\jamboit\backend\node_modules\mongodb\lib\mongo_client.js:284:5
at maybePromise (D:\Personal\jamboit\backend\node_modules\mongodb\lib\utils.js:692:3)
at MongoClient.connect (D:\Personal\jamboit\backend\node_modules\mongodb\lib\mongo_client.js:280:10)
at Function.MongoClient.connect (D:\Personal\jamboit\backend\node_modules\mongodb\lib\mongo_client.js:426:22)
at D:\Personal\jamboit\backend\node_modules\typeorm\src\driver\mongodb\MongoDriver.ts:249:38
at new Promise (<anonymous>)
Just replace host params to url in DataSource options
export const AppDataSource = new DataSource({
type: "mongodb",
url: "mongodb+srv://username:password#database.cluster.mongodb.net/?retryWrites=true&w=majority",
useNewUrlParser: true,
synchronize: true,
useUnifiedTopology: true,
logging: true,
ssl: true,
entities: [
"src/entity/*.ts"
],
subscribers: [],
migrations: [],
})

bad auth Authentication failed

const uri = mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}#cluster0.twqkk.mongodb.net/?retryWrites=true&w=majority;
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

how to use connect-mongo version 4x with express-session. I'm getting errors

I am getting errors while trying to save sessions on MongoDB
const MongoStore = require('connect-mongo');
const connectDB = require('./config/db');
const { connection } = require('mongoose');
app.use(
session({
secret: 'some secret',
resave: false,
saveUninitialized: true,
store: MongoStore.create({
client: connection,
}),
cookie: {
maxAge: 1000 * 60 * 60 * 24,
},
})
);
Error:
C:\Users\Tezz\Desktop\Express\PassportJsAuth\express-session-authenticator\node_modules\connect-mongo\build\main\lib\MongoStore.js:126
.db(options.dbName)
^
TypeError: con.db is not a function
at C:\Users\Tezz\Desktop\Express\PassportJsAuth\express-session-authenticator\node_modules\connect-mongo\build\main\lib\MongoStore.js:126:18
Here is the Solution:
const express = require('express');
const session = require('express-session');
require('dotenv').config();
const MongoStore = require('connect-mongo');
const connectDB = require('./config/db');
const PORT = process.env.PORT || 3001;
const MONGO_URI = process.env.MONGODB;
const app = express();
//connectDB should return the client conn.connection.getClient();
const client = connectDB().then((mClient) => {
app.listen(PORT, () => console.log('Server running...');
return mClient;
}).catch(err => console.log(err));
app.use(express.json());
app.use(express.urlencoded({ extended: true}));
app.use(
session({
secret: 'some-secret',
resave: false,
saveUninitialized: true,
store: MongoStore.create({
client,
}),
})
);
app.get('/', (req, res, next) => {
res.send('<h1>Hello World (sessions)</h1>');
});
```

Operation `mytables.insertOne()` buffering timed out after 10000ms

I am trying to save data to my database MongoDb atlas by making a post request but getting this error "Operation mytables.insertOne() buffering timed out after 10000ms". I have tried many solution available on internet but none of them is working for me (
Server.js
const express = require('express');
const app = express();
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const routesUrls = require('./routes/routes');
const cors = require('cors');
dotenv.config();
mongoose.connect(process.env.DATABASE_ACCESS,{ useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true},()=>console.log("Datbase Connected"));
app.use(express.json());
app.use(cors());
app.use('/app',routesUrls);
app.listen(3000,()=>{
console.log("server.js");
})
routes.js
const express = require('express');
const router = express.Router();
const signUpTemplateCopy = require('../models/SignUpModels');
router.post('/signup',(req,res)=>{
const signedUpUser = new signUpTemplateCopy({
username: req.body.username,
email: req.body.email,
password: req.body.password,
})
// res.send("Hello");
signedUpUser.save()
.then(data=>{
res.send("success");
})
.catch(error=>{
res.send(error.message);
})
})
module.exports = router
SignUpModels
const mongoose = require('mongoose');
const signUpTemplate = new mongoose.Schema({
username:{
type: String,
required: true,
},
email:{
type: String,
required:true,
},
password:{
type:String,
required:true,
},
date:{
type:Date,
default:Date.now,
}
})
module.exports = mongoose.model('mytable',signUpTemplate);
dot.env
DATABASE_ACCESS = "mongodb+srv://nikhil:tempPass#cluster0.lqfx7.mongodb.net/mytable?retryWrites=true&w=majority"
Any help will be appreciated
https://mongoosejs.com/docs/connections.html#buffering
Mongoose lets you start using your models immediately, without waiting for mongoose to establish a connection to MongoDB.
Try
Start your application only after DB is connected.
mongoose.connect(process.env.DATABASE_ACCESS,{ useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true},(err) => {
console.log(err);
app.listen(3000,()=> {
console.log("server.js");
})
});

MongoDb Atlas: UnhandledPromiseRejectionWarning - MongooseTimeoutError

I am new in mongodb and currently following this article: https://medium.com/#beaucarnes/learn-the-mern-stack-by-building-an-exercise-tracker-mern-tutorial-59c13c1237a1
I am using mongoDB atlas as a course suggested and also whitelist my IP in it as many answers suggested.
File: .env
ATLAS_URI=mongodb+srv://sagar:<mypass>#cluster0-2gcdi.gcp.mongodb.net/test?retryWrites=true&w=majority
server.js
const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
const uri = process.env.ATLAS_URI;
mongoose.connect(uri, { useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true }
);
const connection = mongoose.connection;
connection.once('open', () => {
console.log("MongoDB database connection established successfully");
})
const usersRouter = require('./routes/users');
app.use('/users', usersRouter);
app.listen(port, () => {
console.log(`Server is running on port: ${port}`);
});
user.model.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
username: {
type: String,
required: true,
unique: true,
trim: true,
minlength: 3
},
}, {
timestamps: true,
});
const User = mongoose.model('User', userSchema);
module.exports = User;
routes:users.js
const router = require('express').Router();
let User = require('../models/user.model');
router.route('/').get((req, res) => {
User.find()
.then(users => res.json(users))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/add').post((req, res) => {
const username = req.body.username;
const newUser = new User({username});
newUser.save()
.then(() => res.json('User added!'))
.catch(err => res.status(400).json('Error: ' + err));
});
module.exports = router;
currently its showing Error in console:
UnhandledPromiseRejectionWarning: MongooseTimeoutError: Server selection timed out after 30000 ms
at new MongooseTimeoutError (C:\Users\sagar\OneDrive\Desktop\nodejs\mern-exercise-tracker\backend\node_modules\mongoose\lib\error\timeout.js:22:11)
I am also testing my api in postman where its showing:
Could not get any response
There was an error connecting to http://localhost:5000/users/add.
Error of my screenshot: