gaggina
gaggina

Reputation: 5425

Issue in validating things in mongodb and expressjs

I'm having some issues in validating things using expressjs and mongodb.

This is the commented class

// mongodb configuration
var Server = require('mongodb').Server,
  Db       = require('mongodb').Db,
  ObjectID = require('mongodb').ObjectID,
  server   = new Server('localhost',27017,{auto_reconnect:true}),
  db       = new Db('fantacalcio',server);
// mongodb end configuration


var UserModel = function() {

  // max and min username length
  this.username_max = 15;
  this.username_min = 6;
};

// create funcion
UserModel.prototype.create = function(req,callback) {

  // opening connection
  db.open(function(err,db){
    if(!err){

      // choosing the collection
      db.collection('user',function(err,collection){
          if(err){
            console.log(err);
          }
          else{

            // Passing the req.body data and a callback to the validate function (see below) 
            this.validate(req,function(results){

              // if the validate function return true, this will insert the username into the db
              if(results==true){
                collection.insert({username : req.body.username}, function(err,result){
                  if (!err) {
                    db.close();
                    callback(200);
                  }
                }); 
              }
              else{
                callback(results);
              }
            });
          }
      });
    }
  });

};


// validating function
UserModel.prototype.validate = function(req,callback) {

  var errors=0;
  var detail_error;
  var username = req.body.username;

  // check the username
  if(!username || username < this.username_min || username>this.username_max){
    errors++;
    detail_error +="this is an error";
  }

  // will execute the callback witin the error
  if(errors>0){
    callback(detail_error);
  }

  // if there arent error will return true
  else{
    callback(true);
  }
};

the error I get is

TypeError: Object #<Object> has no method 'validate'

refering to the line:

 this.validate(req,function(results){ .......

Upvotes: 0

Views: 178

Answers (1)

ebohlman
ebohlman

Reputation: 15003

The line in question is executed as part of a callback, so this isn't going to be referring to the UserModel instance when the callback is called. The first line of UserModel.prototype.create should declare a variable (usually called self but some people prefer that) and assign this to it. Then replace any cases of this in the callbacks with it.

Remember that this is actually a keyword, not a variable, and it doesn't behave like a variable in closures. If you want to preserve its value in a closure, you have to copy it into an actual variable.

Upvotes: 1

Related Questions