I want to get access to all the collections of my MongoDB database.
But I am unable to do so.
I am using mongoose.connection.db.getCollection(collection_name) just above the listen part of code but console is saying
mongoose.connection.db.getCollection is not a function.
Here is my code
import express from "express";
import mongoose from "mongoose";
import Messages from "./messages.js";
import dynamicModel from "./messagesRoom.js";
import cors from "cors";
// app configuration
const app = express();
const port = process.env.PORT || 9000;
//middleware
app.use(express.json());
app.use(cors());
// DB Configuration
const url = "mongodb+srv://username:password#cluster0.zp9dc.mongodb.net/Whatsapp_MERN";
mongoose.connect(url, {useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true})
.then(()=> console.log('mongoDB is connected'))
.then(err => console.log(err));
const db = mongoose.connection;
db.once('open', () => {
console.log("DB is connected");
const msgCollection = db.collection('messagecontents');
const changeStream = msgCollection.watch();
changeStream.on('change', (change) => {
console.log(change);
if(change.operationType === 'insert'){
const msgDetails = change.fullDocument;
pusher.trigger('messages', 'inserted',
{
name: msgDetails.name,
message: msgDetails.message,
timestamp: msgDetails.timestamp,
received: msgDetails.received,
})
}
else{
console.log('Error triggering pusher');
}
})
})
// API routes
app.get("/", (req, res) => {
res.status(200).send("Hello World");
})
app.get("/messages/sync", async (req, res) => {
await Messages.find( (err, data) => {
if(err){
console.log(err);
res.status(500).send(err);
}else{
res.status(200).send(data);
}
})
})
app.post("/changeChat", (req, res) => {
const collection_name = req.body.chatName;
let collection = mongoose.connection.db.getCollection("collection_name");
console.log(collection);
})
// listening part
app.listen(port, () => console.log(`listening on port number ${port}`));
please suggest me a way using which I can get access to collections of database according to the name I am using.
mongoose.connection.on('open', function (ref) {
mongoose.connection.db.listCollections().toArray(function(err, names){
console.log(names)
})
})
Try this code block below "mongoose.connect()", the 'listCollections()' function will return the list of all the collection in the respective database and 'toArray()' function will convert that list into array, then we simply log the array.
Related
I have created a MongoDB database named: "helsinki_city_bike" and I uploaded CSV data using MongoDB compass in the collection name: "journey_detail". I also connected the database to atlas using a connection string. Now that I want to fetch the data from the database it's creating another test db and collection name "journey_detail" inside "helsinki_city_bike".
how can I fetch data from my collection without creating an empty collection?
the function is working well as I am getting an empty array. what I am doing wrong with the model?
This is my schema:
import mongoose from "mongoose";
export const journeySchema = mongoose.Schema({
Departure_time: String,
Return_time: String,
Departure_Station_Id: Number,
Departure_Station_Name: String,
Return_Station_Id: Number,
Return_Station_Name: String,
Covered_Distance: Number,
Duration: Number,
});
export const journey_detail = mongoose.model("journey_detail", journeySchema);
req function:
import { journey_detail } from "../models/Schema.js";
export const getJourneyDetails = async (req, res) => {
try {
const JourneyDetails = await journey_detail.find().limit(10);
if (!JourneyDetails) {
return res.status(404).json({ message: "Journey Details not found" });
}
res.status(200).json(JourneyDetails);
} catch (error) {
console.error(error);
res.status(500).json({ message: "Error retrieving Journey Details" });
}
};
connection:
const app = express();
dotenv.config();
app.use(bodyParser.json({ limit: "30mb", extended: true }));
app.use(bodyParser.urlencoded({ limit: "30mb", extended: true }));
app.use(cors());
app.use("/", router);
mongoose
.connect(process.env.CONNECTION_URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() =>
app.listen(3001, () => console.log(`server running on the port ${3001}`))
)
.catch((error) => console.log(error));
mongoose.set();
mongoose.connection.on("open", () => {
console.log("Mongoose connected.");
});
I have created a MongoDB database named: "helsinki_city_bike" and I uploaded CSV data using MongoDB compass in the collection name: "journey_detail". I also connected the database to atlas using a connection string. Now that I want to fetch the data from the database it's creating another test db and collection name "journey_detail" inside "helsinki_city_bike".
how can I fetch data from my collection without creating an empty collection?
the function is working well as I am getting an empty array. what I am doing wrong with the model?
This is my schema:
import mongoose from "mongoose";
export const journeySchema = mongoose.Schema({
Departure_time: String,
Return_time: String,
Departure_Station_Id: Number,
Departure_Station_Name: String,
Return_Station_Id: Number,
Return_Station_Name: String,
Covered_Distance: Number,
Duration: Number,
});
export const journey_detail = mongoose.model("journey_detail", journeySchema);
req function:
import { journey_detail } from "../models/Schema.js";
export const getJourneyDetails = async (req, res) => {
try {
const JourneyDetails = await journey_detail.find().limit(10);
if (!JourneyDetails) {
return res.status(404).json({ message: "Journey Details not found" });
}
res.status(200).json(JourneyDetails);
} catch (error) {
console.error(error);
res.status(500).json({ message: "Error retrieving Journey Details" });
}
};
connection:
const app = express();
dotenv.config();
app.use(bodyParser.json({ limit: "30mb", extended: true }));
app.use(bodyParser.urlencoded({ limit: "30mb", extended: true }));
app.use(cors());
app.use("/", router);
mongoose
.connect(process.env.CONNECTION_URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() =>
app.listen(3001, () => console.log(`server running on the port ${3001}`))
)
.catch((error) => console.log(error));
mongoose.set();
mongoose.connection.on("open", () => {
console.log("Mongoose connected.");
});
I am really new to the industry and have this error when trying to check the database connection via API reuests with postman..... Please help me to settle this issue...
I just want to check the mongodb database by sendng API requests. Still I cannot identify the error and I am following a set of tutorials and occure this issue... Anyone can help me to identify the mistake it's highly appreciated....
{ this is dummy text to avoid please add more details...
Here is my code...
const app = express();
const { MongoClient } = require('mongodb');
const PORT = process.env.PORT || 8000;
// Initialize middleware
// we used to install body parser but now it's a built in middleware
// Function of express. It parses incoming JSONpayload
// app.use(express.json({extended:false}));
app.use(express.json({ extended: false }));
// Test Routs
// app.get("/", (req,res)=>res.send("Hello Aruna !!!"));
// app.post("/", (req,res)=>res.send(`Hello ${req.body.name} `));
// app.get("/hello/:name", (req.res)=>res.send(`Hello ${req.params.name}`))
app.get('/api/articles/:name', async (req, res) => {
try {
const articleName = req.params.name;
const client = await MongoClient.connect('mongodb://localhost:27017');
const db = client.db('mernblog');
const articlesinfo = db
.collection('articles')
.findOne({ name: articleName });
res.status(200).jason(articlesinfo);
client.close();
} catch (error) {
res.status(500).jason({ message: 'Error connecting to database', error });
}
});
app.post('/api/articles/:name/add-comments', (req, res) => {
const { username, text } = req.body;
const articleName = req.params.name;
articlesinfo[articleName].comments.push({ username, text });
res.status(200).send(articlesinfo[articleName]);
});
app.post('/', (req, res) => res.send(`Hello ${req.body.name}`));
app.get('/hello/:name', (req, res) => res.send(`Hello ${req.params.name}`));
app.listen(PORT, () => console.log(`Server is running at port ${PORT}`));
Server.js
Terminal
Error and API request in Postman
You have a typo in your code: jason should be json.
Other tips, you should handle your DB connection in a separate method and change your post request since articlesinfo is not a global variable:
const app = express();
const { MongoClient } = require('mongodb');
const PORT = process.env.PORT || 8000;
const client = new MongoClient('mongodb://localhost:27017');
const connectDB = async () => {
try {
await client.connect();
console.log('Successfully connected to DB')
} catch (err) {
await client.close();
console.log('Error connecting to DB');
process.exit(1);
}
}
// Initialize middleware
// we used to install body parser but now it's a built in middleware
// Function of express. It parses incoming JSONpayload
// app.use(express.json({extended:false}));
app.use(express.json({ extended: false }));
// Test Routs
// app.get("/", (req,res)=>res.send("Hello Aruna !!!"));
// app.post("/", (req,res)=>res.send(`Hello ${req.body.name} `));
// app.get("/hello/:name", (req.res)=>res.send(`Hello ${req.params.name}`))
app.get('/api/articles/:name', async (req, res) => {
try {
const articleName = req.params.name;
const db = client.db('mernblog');
const articlesinfo = db
.collection('articles')
.findOne({ name: articleName });
res.status(200).json(articlesinfo);
client.close();
} catch (error) {
res.status(500).json({ message: 'Error connecting to database', error });
}
});
app.post('/api/articles/:name/add-comments', (req, res) => {
const { username, text } = req.body;
const articleName = req.params.name;
const db = client.db('mernblog');
const articlesinfo = db
.collection('articles')
.updateOne({ name: articleName }, { $push: { comments: { username, text } } });
res.status(200).send(articlesinfo);
});
app.post('/', (req, res) => res.send(`Hello ${req.body.name}`));
app.get('/hello/:name', (req, res) => res.send(`Hello ${req.params.name}`));
connectDB();
app.listen(PORT, () => console.log(`Server is running at port ${PORT}`));
I'm trying to make a POST request to my database. However, when I use Postman to test if the request is being made, it's giving me back an error,
Cannot POST /api/grocery
I'm using Model, View, Controller for my project. This is my index file
const express = require('express')
const app = express()
const port = 3000
const groceryController = require('./Controller/controllerGrocery.js')
app.use(express.urlencoded({extended: true}));
app.post('api/grocery', (req, res) => {
groceryController.addGrocery(req, res)
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
This is my controller file
const models = require('../Model/modelGrocery.js')
const addGrocery = (req, res) => {
const addGrocery = (err) => {
if (err) {
res.status(500).send()
} else {
res.status(201).end();
}
}
models.addGrocery(req.body, addGrocery)
}
module.exports = {
addGrocery: addGrocery
}
This is my model file that I'm connecting to the database
var db = require('../../DB/db.js');
const getGrocery = (doNext) => {
//query the database
db.find()
.then(result => doNext(null, result))
.catch(err => doNext(err))
//callback
}
const addGrocery = (grocery, callback) => {
db.insertOne({
item: grocery.item,
quantity: grocery.quantity
})
.catch(err => callback(err))
}
module.exports = {
addGrocery: addGrocery
}
Change API Path from api/grocery to /api/grocery
app.post('/api/grocery', (req, res) => {
groceryController.addGrocery(req, res)
})
I am very new to React Native and I am trying to figure out how to connect my front end to my back end. I realize I may have my folder structure set up oddly but the connection works and I can fetch data from the database but when I attempt a post, it throws a 500 error. I cannot seem to figure out what is happening with it. If anyone has some insight I would greatly appreciate it. The post method console logs the req.body and "Here we are" in the controller file but fails immediately after that.
// index.js
require("dotenv").config();
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const morgan = require("morgan");
const { UserRoutes, TweetsRoutes } = require("./modules");
import dbConfig from "./config/db";
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(morgan("dev"));
// -----Database ----- \\
dbConfig(process.env.MONGO_DB_URL);
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
});
app.use("/api", [UserRoutes, TweetsRoutes]);
// app.get("/", (req, res) => {
// res.send("endpoint live");
// });
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server listening on port ${PORT}🏄`));
// db.js
const mongoose = require("mongoose");
export default mongoURL => {
mongoose.Promise = global.Promise;
mongoose.connect(
mongoURL,
{ useNewUrlParser: true }
);
let db = mongoose.connection;
db.once("open", () => console.log("Connected to the database"));
db.on("error", console.error.bind(console, "Mongo connection error: "));
};
// tweetController.js
import Tweet from "./TweetsSchema";
module.exports = {
createTweet: async (req, res, next) => {
const createdTweet = req.body;
console.log("req.body: ", req.body);
try {
console.log("Here we are");
let tweet = await new Tweet.create(createdTweet);
tweet.save();
console.log("tweet: ", tweet);
res.status(201).json(tweet);
} catch (error) {
res.status(500).json({
error: true,
message: "There was an error creating the tweet"
});
}
},
getAllTweets: async (req, res, next) => {
const foundTweets = await Tweet.find({})
.lean()
.exec();
res.status(200).json(foundTweets);
next();
}
};
// actions.js
export const postTweet = tweet => {
let response = axios
.post(
`http://10.0.2.2:<PORT>/api/tweet`,
{ tweet },
{
headers: {
"Content-Type": "application/json;charset=UTF-8",
"Access-Control-Allow-Origin": "*"
}
}
)
.then(res => {
return res.data;
})
.catch(error => {
console.log(error);
});
return {
type: POST_TWEET,
payload: response
};
};
The problem is you mixed 2 commands for creating a new document
Instead of using both new and create like this:
let tweet = await new Tweet.create(createdTweet);
You should use only 1 of them like so:
let tweet = await Tweet.create(createdTweet);
tweet.save();
Or:
let tweet = new Tweet(createdTweet);
await tweet.save();