验证mongodb和expressjs中的问题

时间:2012-08-16 15:52:24

标签: javascript node.js mongodb express

我在使用expressjs和mongodb验证事情时遇到了一些问题。

这是评论课

// 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);
  }
};

我得到的错误是

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

参考以下行:

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

1 个答案:

答案 0 :(得分:1)

有问题的行是作为回调的一部分执行的,因此调用回调时this不会引用UserModel实例。 UserModel.prototype.create的第一行应声明一个变量(通常称为self,但有些人更喜欢that)并为其指定this。然后用它替换回调中this的任何情况。

请记住,this实际上是一个关键字,而不是变量,并且它在闭包中的行为不像变量。如果要在闭包中保留其值,则必须将其复制到实际变量中。