Need a common mongodb connection for every module in nodejs - javascript

I am working on a task with different modules.
I require a common mongodb connection for each and every module..
How can I write in some module and use in this because the db connection is also required in some other modules...
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var dbo;
MongoClient.connect(url, function(err, db) {
if (err) throw err;
dbo = db.db("mydb");
});
router.post('/', function(req, res) {
dbo.collection("customers").find({"userid":req.body.userid}).toArray(function(err, result) {
if (err) throw err;
if(result.length>0){
res.send("username already taken please enter differnt username ")
}
else if(req.body.fname==undefined||(!validator.isAlpha(req.body.fname))){
res.send("please enter only alphabets as fname ")
}
else if(req.body.lname==undefined||(!validator.isAlpha(req.body.lname))){
res.send("please enter only alphabets as lname ")
}
else if(req.body.userid==undefined||(!validator.isAlphanumeric(req.body.userid))){
res.send("please enter only alphanemric as user name ")
}
else if(req.body.pwd==undefined||req.body.pwd.length<6){
res.send("please enter atleast 6 charcaters as password ")
}
else{
var bcrypt = require('bcryptjs');
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync(req.body.pwd, salt);
req.body.pwd=hash;
dbo.collection("customers").insertOne(req.body, function(err, res) {
if (err) throw err;
console.log("1 document inserted");
});
res.send(req.body);
}
});
});
module.exports = router;

use can use node export and import, to that you can use mongodb connection instance in other modules also,
assuming dbo is variable where you want to store mongodb connection
export let dbo;
MongoClient.connect(url, function(err, db) {
if (err) throw err;
dbo = db.db("mydb");
});
you can assign db connection to dbo variable and and use it in whichever module you want

you have to create a middleware for your connection and then assign the db object to your request object ( req in your case )
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
router.use( (req,res,next) => {
MongoClient.connect(url, function(err, db) {
if (err) throw err;
req.dbo = db.db("mydb");
next();
});
})
in your router.post("/", ...) you will do req.dbo.collection(...)

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var dbo=null;
exports.conection=function(){
if(dbo!=null) return
MongoClient.connect(url, function(err, db) {
if (err) throw err;
dbo = db.db("mydb");
});
}
exports.get = function (){
return dbo;
}
i tried this and i use get method when ever i require this is working for me

Related

MongoDB find function not returning the expected result

I m new to mongoDB, and I try to return a value from a search:
function verifyUser(username) {
var nrs = 0;
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if(err) throw err;
var dbo = db.db("numbers");
dbo.collection("numbers").find({ name: username }).toArray(function(err, res){
if(err) throw err;
console.log(res.length);
db.close();
})
});}
verifyUser("test");
I have one record with the name 'test';
But when I try to prove it is not working:
console.log(verifyUser("test") === 1);
I tried to return instead of console.log but it doesn't work.

Mongo is only accessed after second api request

I want to read out a mongodb database with API URLS. When I access /showdb in my browser the json is only display after the second refresh. How can I get it the first time? Thanks!
const express = require("express");
const app = express();
var mongo = require('mongodb');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var resultdb;
function readDB() {
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("simpledb");
dbo.collection("simplecollection").find().toArray(function(err, result) {
if (err) throw err;
resultdb = result;
db.close();
});
});
return resultdb;
};
//handle normal file requests etc.
app.use(express.static(__dirname + "/"));
app.get('/showdb', function(req, res) {
res.send(readDB());
});
app.listen(10008);
console.log("Server running on port: " + 10008);
What happens here is that you return resultdb without awaiting the db response. Hence why second call works due to your variable is getting updated after res has been sent. Try below
const url = "mongodb://localhost:27017/";
const mongoClient = new MongoClient(new Server(url, 27017));
async function readDB() {
mongoClient.open(function(err, db) {
if (err) throw err;
var dbo = db.db("simpledb");
const res = dbo.collection("simplecollection").find().toArray(function(err, result) {
if (err) throw err;
return result
});
mongoClient.close();
return await res
});
};
mongoClient.open(function(err, mongoClient) {
var db1 = mongoClient.db("mydb");
mongoClient.close();
});
Also, it's not a good practice to create connection for every task.
I would suggest to create a separate function to connect upon server start & then just use client.open() when you want to do db tasks
You need to use the callbacks you can't use synchronous code. Like this:
app.get('/', (req, res) => {
MongoClient.connect(url, (conn, err) => {
conn.db('foo').collection('bar').find().toArray((err, result) => {
res.send(result)
})
})
})
The callback functions are executed later that's why they are callbacks. If you want to write code that looks more like synchronous code look at promise API and await
The problem with code is that it does not wait for readDB() to finish it tasks with Mongodb and returns with empty as resultdb is just defined.
But when you call it once, after the request is served, readDB() would have received data from Mongodb and it will be set to resultdb. Next time when you call the api, you get the result processed in the previous api call and not the new one.
Try this -
app.get('/showdb', async function(req, res) {
const result = await readDB(); // here we are waiting for the results to finish using await.
res.send(result);
});
and your readDB function as -
async function readDB() { // making using of async here.
MongoClient.connect(url, function(err, db) {
if (err) throw err;
const dbo = db.db('simpledb');
dbo.collection('simplecollection').find().toArray(function(err, result) {
if (err) throw err;
resultdb = result;
return resultdb; // we can now return it.
db.close();
});
});
};
Note: Considering you're using an updated Node version with support for async - await
--- UPDATE ----
You can try this -
app.get('/showdb', async function(req, res) {
readDB(req, res);
});
function readDB(req, res) { // making using of async here.
MongoClient.connect(url, function(err, db) {
if (err){
res.send(err);
throw err;
}
const dbo = db.db('simpledb');
dbo.collection('simplecollection').find().toArray(function(err, result) {
if (err){
res.send(err);
throw err;
}
res.send(result)
db.close();
});
});
};

How to use another MongoDB database using Node.js [duplicate]

How do I connect to mongodb with node.js?
I have the node-mongodb-native driver.
There's apparently 0 documentation.
Is it something like this?
var mongo = require('mongodb/lib/mongodb');
var Db= new mongo.Db( dbname, new mongo.Server( 'mongolab.com', 27017, {}), {});
Where do I put the username and the password?
Also how do I insert something?
Thanks.
Per the source:
After connecting:
Db.authenticate(user, password, function(err, res) {
// callback
});
Everyone should use this source link:
http://mongodb.github.com/node-mongodb-native/contents.html
Answer to the question:
var Db = require('mongodb').Db,
MongoClient = require('mongodb').MongoClient,
Server = require('mongodb').Server,
ReplSetServers = require('mongodb').ReplSetServers,
ObjectID = require('mongodb').ObjectID,
Binary = require('mongodb').Binary,
GridStore = require('mongodb').GridStore,
Code = require('mongodb').Code,
BSON = require('mongodb').pure().BSON,
assert = require('assert');
var db = new Db('integration_tests', new Server("127.0.0.1", 27017,
{auto_reconnect: false, poolSize: 4}), {w:0, native_parser: false});
// Establish connection to db
db.open(function(err, db) {
assert.equal(null, err);
// Add a user to the database
db.addUser('user', 'name', function(err, result) {
assert.equal(null, err);
// Authenticate
db.authenticate('user', 'name', function(err, result) {
assert.equal(true, result);
db.close();
});
});
});
var mongo = require('mongodb');
var MongoClient = mongo.MongoClient;
MongoClient.connect('mongodb://'+DATABASEUSERNAME+':'+DATABASEPASSWORD+'#'+DATABASEHOST+':'DATABASEPORT+'/'+DATABASENAME,function(err, db){
if(err)
console.log(err);
else
{
console.log('Mongo Conn....');
}
});
//for local server
//in local server DBPASSWOAD and DBusername not required
MongoClient.connect('mongodb://'+DATABASEHOST+':'+DATABASEPORT+'/'+DATABASENAME,function(err, db){
if(err)
console.log(err);
else
{
console.log('Mongo Conn....');
}
});
I find using a Mongo url handy. I store the URL in an environment variable and use that to configure servers whilst the development version uses a default url with no password.
The URL has the form:
export MONGODB_DATABASE_URL=mongodb://USERNAME:PASSWORD#DBHOST:DBPORT/DBNAME
Code to connect this way:
var DATABASE_URL = process.env.MONGODB_DATABASE_URL || mongodb.DEFAULT_URL;
mongo_connect(DATABASE_URL, mongodb_server_options,
function(err, db) {
if(db && !err) {
console.log("connected to mongodb" + " " + lobby_db);
}
else if(err) {
console.log("NOT connected to mongodb " + err + " " + lobby_db);
}
});
My version:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://user:pass#dhost:port/baseName', function(err, db) {
if (err) {
console.error(err);
}
var collection = db.collection('collectionName');
collection.find().toArray(function(err, docs) {
console.log(docs);
});
});
I recommend mongoskin I just created.
var mongo = require('mongoskin');
var db = mongo.db('admin:pass#localhost/mydb?auto_reconnnect');
db.collection('mycollection').find().toArray(function(err, items){
// do something with items
});
Is mongoskin sync? Nop, it is async.
Here is new may to authenticate from "admin" and then switch to your desired DB for further operations:
var MongoClient = require('mongodb').MongoClient;
var Db = require('mongodb').Db, Server = require('mongodb').Server ,
assert = require('assert');
var user = 'user';
var password = 'password';
MongoClient.connect('mongodb://'+user+':'+password+'#localhost:27017/opsdb',{native_parser:true, authSource:'admin'}, function(err,db){
if(err){
console.log("Auth Failed");
return;
}
console.log("Connected");
db.collection("cols").find({loc:{ $eq: null } }, function(err, docs) {
docs.each(function(err, doc) {
if(doc) {
console.log(doc['_id']);
}
});
});
db.close();
});
This worked for me:
Db.admin().authenticate(user, password, function() {} );
You can do it like this
var db = require('mongo-lite').connect('mongodb://localhost/test')
more details ...
if you continue to have problems with the native driver, you can also check out sleepy mongoose. It's a python REST server that you can simply access with node request to get to your Mongo instance.
http://www.snailinaturtleneck.com/blog/2010/02/22/sleepy-mongoose-a-mongodb-rest-interface/
With the link provided by #mattdlockyer as reference, this worked for me:
var mongo = require('mongodb');
var server = new mongo.Server(host, port, options);
db = new mongo.Db(mydb, server, {fsync:true});
db.open(function(err, db) {
if(!err) {
console.log("Connected to database");
db.authenticate(user, password, function(err, res) {
if(!err) {
console.log("Authenticated");
} else {
console.log("Error in authentication.");
console.log(err);
}
});
} else {
console.log("Error in open().");
console.log(err);
};
});
exports.testMongo = function(req, res){
db.collection( mycollection, function(err, collection) {
collection.find().toArray(function(err, items) {
res.send(items);
});
});
};
Slight typo with Chris' answer.
Db.authenticate(user, password, function({ // callback }));
should be
Db.authenticate(user, password, function(){ // callback } );
Also depending on your mongodb configuration, you may need to connect to admin and auth there first before going to a different database. This will be the case if you don't add a user to the database you're trying to access. Then you can auth via admin and then switch db and then read or write at will.
const { MongoClient } = require('mongodb');
// or as an es module:
// import { MongoClient } from 'mongodb'
// Connection URL
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);
// Database Name
const dbName = 'myProject';
async function main() {
// Use connect method to connect to the server
await client.connect();
console.log('Connected successfully to server');
const db = client.db(dbName);
const collection = db.collection('documents');
// the following code examples can be pasted here...
return 'done.';
}
main()
//what to do next
.then(console.log)
//if there is an error
.catch(console.error)
// what to do in the end(function result won't matter here, it will execute always).
.finally(() => client.close());
you can find more in the documentation here: https://mongodb.github.io/node-mongodb-native/4.1/
I'm using Mongoose to connect to mongodb.
Install mongoose npm using following command
npm install mongoose
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/database_name', function(err){
if(err){
console.log('database not connected');
}
});
var Schema = mongoose.Schema;
var userschema = new Schema ({});
var user = mongoose.model('collection_name', userschema);
we can use the queries like this
user.find({},function(err,data){
if(err){
console.log(err);
}
console.log(data);
});

mongodb database return from callback

I have this code
var mongodb = require('mongodb'), assert = require('assert');
var Db = mongodb.Db;
var db = new Db('local', new Server('localhost', 27017);
db.open(functioin(err, db){
if(err) throw err;
var adminDb = db.admin();
adminDb.listDatabases(function(err, dbs){
if(err) throw err;
console.log(dbs);
});
});
I want to export the dbs variable from the callback of the listDatabases function.
Is there any way?
Thanks guys. It finally worked for me with this code.
var db = new Db('test', new Server('localhost', 27017));
// Establish connection to db
db.open(function(err, db) {
// Use the admin database for the operation
var adminDb = db.admin();
// List all the available databases
adminDb.listDatabases(function(err, dbs) {
assert.equal(null, err);
assert.ok(dbs.databases.length > 0);
db.close();
});
});

How do I create a new database using the MongoDB Node.JS driver?

How do I programmatically create a database using the MongoDB Node.JS driver?
This looks promising, but I'm not sure how to connect to with the admin credentials and create a new database.
var db = new Db('test', new Server('locahost', 27017));
// Establish connection to db
db.open(function(err, db) {
assert.equal(null, err);
// Add a user to the database
db.addUser('user3', 'name', function(err, result) {
assert.equal(null, err);
// Authenticate
db.authenticate('user3', 'name', function(err, result) {
assert.equal(true, result);
// Logout the db
db.logout(function(err, result) {
assert.equal(true, result);
// Remove the user
db.removeUser('user3', function(err, result) {
assert.equal(true, result);
db.close();
});
});
});
});
});
in mongodb databases and collections are created on first access. When the new user first connects and touches their data, their database will get created then.
This seems to work.
var Db = require('mongodb').Db,
Server = require('mongodb').Server;
var db = new Db('test', new Server('localhost', 27017));
db.open(function (err, db) {
if (err) throw err;
// Use the admin database for the operation
var adminDb = db.admin();
adminDb.authenticate('adminLogin', 'adminPwd', function (err, result) {
db.addUser('userLogin', 'userPwd', function (err, result) {
console.log(err, result);
});
});
});
Try as below:
var adminuser = "admin";
var adminpass = "admin";
var server = "localhost";
var port = 27017;
var dbName = "mydatabase";
var mongodb = require('mongodb');
var mongoClient = mongodb.MongoClient;
var connString = "mongodb://"+adminuser+":"+adminpass+"#"+server+":"+port+"/"+dbName;
mongoClient.connect(connString, function(err, db) {
if(!err) {
console.log("\nMongo DB connected\n");
}
else{
console.log("Mongo DB could not be connected");
process.exit(0);
}
});

Categories

Resources