在 mongodb 和 expressjs 中验证事物的问题

Issue in validating things in mongodb and expressjs

本文关键字:问题 验证 mongodb expressjs      更新时间:2023-09-26

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

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

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