我在使用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){ .......
答案 0 :(得分:1)
有问题的行是作为回调的一部分执行的,因此调用回调时this
不会引用UserModel
实例。 UserModel.prototype.create
的第一行应声明一个变量(通常称为self
,但有些人更喜欢that
)并为其指定this
。然后用它替换回调中this
的任何情况。
请记住,this
实际上是一个关键字,而不是变量,并且它在闭包中的行为不像变量。如果要在闭包中保留其值,则必须将其复制到实际变量中。