3

my friend and I are trying to create a basic webapp with Node.js and MongoDB, and we've ran into a problem while trying to connect to the database. The error that we're receiving is as follows:

C:\Users\James Kienle\Dropbox\Apps\Azure\Hanky-Ranky\server.js:24 mongoClient.open(function(err, mongoClient) { //C ^ TypeError: undefined is not a function at Object. (C:\Users\James Kienle\Dropbox\Apps\Azure\Hanky-Ranky\server.js:24:13) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Function.Module.runMain (module.js:501:10) at startup (node.js:129:16) at node.js:814:3

Here's server.js, our main file

// Bring in required references
var http = require('http'),
    express = require('express'),
    path = require('path'),
    MongoClient = require('mongodb').MongoClient,
    Server = require('mongodb').Server,
    CollectionDriver = require('./collectionDriver').CollectionDriver;

// Set the default port for the app
var port = process.env.PORT || 1337;

// Create the new express app and set all required variables such as port and static html path
var app = express();
app.set('port', port); 
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Connect to MongoDB
var mongoHost = 'ds040898.mongolab.com'; //A
var mongoPort = 40898; 
var collectionDriver;

var mongoClient = new MongoClient(new Server(mongoHost, mongoPort)); //B
mongoClient.open(function(err, mongoClient) { //C
  if (!mongoClient) {
      console.error("Error! Exiting... Must start MongoDB first");
      process.exit(1); //D
  }
  var db = mongoClient.db("MongoLab-0");  //E
  db.authenticate('testuser', 'testpassword', function(err, result) {
    collectionDriver = new CollectionDriver(db); //F
  });
});

// Set up the expressjs public path
app.use(express.static(path.join(__dirname, 'public')));

// BRING IN THE DATA
app.get('/:collection', function(req, res) { //A
   var params = req.params; //B
   collectionDriver.findAll(req.params.collection, function(error, objs) { //C
          if (error) { res.send(400, error); } //D
          else { 
              if (req.accepts('html')) { //E
                  res.render('data',{objects: objs, collection: req.params.collection}); //F
              } else {
              res.set('Content-Type','application/json'); //G
                  res.send(200, objs); //H
              }
         }
    });
});

app.get('/:collection/:entity', function(req, res) { //I
   var params = req.params;
   var entity = params.entity;
   var collection = params.collection;
   if (entity) {
       collectionDriver.get(collection, entity, function(error, objs) { //J
          if (error) { res.send(400, error); }
          else { res.send(200, objs); } //K
       });
   } else {
      res.send(400, {error: 'bad url', url: req.url});
   }
});

// Pull the template for a 404 page
app.use(function (req,res) {
    res.render('404', {url:req.url}); 
});

// Create the node server
http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

And here's CollectionDriver.js

// Import the required MongoDB Packages
var ObjectID = require('mongodb').ObjectID;

// Define the CollectionDriver constructor method for later use
CollectionDriver = function(db) {
  this.db = db;
};

// Fetch a collection by name
CollectionDriver.prototype.getCollection = function(collectionName, callback) {
  this.db.collection(collectionName, function(error, the_collection) {
    if( error ) callback(error);
    else callback(null, the_collection);
  });
};

// Return all found objects
CollectionDriver.prototype.findAll = function(collectionName, callback) {
    this.getCollection(collectionName, function(error, the_collection) { //A
      if( error ) callback(error);
      else {
        the_collection.find().toArray(function(error, results) { //B
          if( error ) callback(error);
          else callback(null, results);
        });
      }
    });
};

// Obtain and display a single item vie _id
CollectionDriver.prototype.get = function(collectionName, id, callback) { //A
    this.getCollection(collectionName, function(error, the_collection) {
        if (error) callback(error);
        else {
            var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$"); //B
            if (!checkForHexRegExp.test(id)) callback({error: "invalid id"});
            else the_collection.findOne({'_id':ObjectID(id)}, function(error,doc) { //C
                if (error) callback(error);
                else callback(null, doc);
            });
        }
    });
};

exports.CollectionDriver = CollectionDriver;

And here's our package.json file. All of the dependencies listed in this file have been installed properly to my knowledge

{
  "name": "hanky-ranky",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "express": "4.13.3",
    "jade": "1.11.0",
    "mongodb":"2.0.42"
  }
}

If it helps, I'm trying to follow a tutorial from this website: http://www.raywenderlich.com/61078/write-simple-node-jsmongodb-web-service-ios-app

Thanks guys! Really appreciate the help!

3
  • server.js:24 what is on that line? line 24 Commented Sep 13, 2015 at 16:57
  • Line 24 is as follows: mongoClient.open(function(err, mongoClient) { Commented Sep 13, 2015 at 17:39
  • 1
    Check your MongoDb url format..it's usually like this. mongodb://<dbuser>:<dbpassword>@ds040898.mongolab.com:47602/<db> Commented Sep 13, 2015 at 18:03

1 Answer 1

5

The mongodb version used in the tutorial is 1.3.23. Your mongodb version is 2.0.42. Seems like implementation is changed.

This is how you connect to mongodb in 2.0 version:

var MongoClient = require('mongodb').MongoClient;
// Connection url
var url = 'mongodb://localhost:27017/test';
// Connect using MongoClient
MongoClient.connect(url, function(err, db) {
   // Use the admin database for the operation
   var adminDb = db.admin();
   // List all the available databases
   adminDb.listDatabases(function(err, dbs) {

   });
});

You will have to change the code slightly to work with the new version or you will have to install mongodb 1.3.23.

You can get more details at: http://mongodb.github.io/node-mongodb-native/2.0/

Sign up to request clarification or add additional context in comments.

1 Comment

Looks like that fixed it! Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.