0

我在使用 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){ .......
4

1 回答 1

1

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

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

于 2012-08-16T16:44:40.733 回答