0

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){ .......

1 Answer 1

1

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.

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

Comments

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.