Emil Tsvetanov
Emil Tsvetanov

Reputation: 1

Why my function for retrieving data from mongodb is returning undefined?

I am trying to return all the entries from a mongodb collection from a nodejs. I had written the function and it works if i console log the result i see all the objects from the colletion, but if i try to return the result i am getting undefined. I cant figure it out why? I had also tried to JSON stringify and JSON parse after but still no success.

Here is my code: `

const mongoUrl = "mongodb://192.168.8.156:27017/";

const getRoomReadings = function (id) {
  MongoClient.connect(mongoUrl, function (err, db) {
    if (err) throw err;
    let dbo = db.db(`room${id}`);
    dbo
      .collection("env")
      .find({})
      .toArray(function (err, result) {
        if (err) throw err;
        return result;
      });
  });
};

// API RoomX route
app.get("/api/r:id", (req, res) => {
  const rez = getRoomReadings(req.params.id);
  console.log(rez);
});

`

I am using nodejs with express. Please help me. Thanks in advance.

I had also tried to JSON stringify and JSON parse after but still no success.

Upvotes: 0

Views: 36

Answers (1)

Martinez
Martinez

Reputation: 1130

I don't know why you created the connection each time you do the request but using promises will help you.

Example:

const mongoUrl = "mongodb://192.168.8.156:27017/";

const getRoomReadings = function (id) {
  return new Promise((res, rej) => {
    MongoClient.connect(mongoUrl, function (err, db) {
      if (err) rej(err);
      let dbo = db.db(`room${id}`);
      dbo
        .collection("env")
        .find({})
        .toArray(function (err, result) {
          if (err) rej(err);
          return res(result);
        });
    });
  })
};

// API RoomX route
app.get("/api/r:id", async (req, res) => {
  const rez = await getRoomReadings(req.params.id);
  console.log(rez);
});

a better way to create a connection it creating a file call conn.js and inside that file create your connection

const { MongoClient } = require("mongodb");
const connectionString = process.env.ATLAS_URI;
const client = new MongoClient(connectionString, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

let dbConnection;

module.exports = {
  connectToServer: function (callback) {
    client.connect(function (err, db) {
      if (err || !db) {
        return callback(err);
      }

      dbConnection = db.db(<db_name>);
      console.log("Successfully connected to MongoDB.");

      return callback();
    });
  },

  getDb: function () {
    return dbConnection;
  },
};

initialize the connection and use getDb to get the connection

Upvotes: 1

Related Questions