JavaScript-var self=this;self是未定义的



所以这是我遇到的一种情况。我有一个具有许多属性和方法的构造函数。以下是属性:

var Brain = function(){
this.util = require('util');
this.fs = require('fs');
this.assert = require('assert');
this.Sequelize = require('sequelize');
this.JsonField = require('sequelize-json');
this.bcrypt = require('bcrypt-nodejs');
this.bodyParser = require('body-parser');
this.fileUpload = require('express-fileupload');
// Custom Modules
this.ModelsModule = require('./models');
this.TombModule = require('./tomb');
}

定义了一些方法来调用给定的回调并将数据传递给它,例如:

Brain.prototype.db_read = function(request, response, data, callback) {
var self = this;
self.ModelsModule[data.Model].findOne(data.where)
.then(function(obj) {
// console.log(obj);
callback(request, response, obj);
})
.catch(function(error){
console.log(error);
});
}

事情是这样的——回调函数总是同一构造函数的另一个方法。这里有另一种回调方法:

Brain.prototype.login = function(request, response, user) {
var self = this;
// console.log('form-data --- ', request.body);
if(user == null || user == undefined) {
console.log('Account Load: Failed');
return response.render( self.TombModule.pages['login'], {error: 'Invalid Credentials'} );
}
else {
// console.log(user.dataValues);
if( self.bcrypt.compareSync(request.body.pswrd, user.dataValues.pswrd) == false ) {
console.log('Account Load: Failed');
return response.render( self.TombModule.pages['login'], {error: 'Invalid Credentials'} );
}
console.log('Account Load: Successful');
request.session.you = {
id: user.dataValues.id,
f_name: user.dataValues.f_name,
m_initial: user.dataValues.m_initial,
l_name: user.dataValues.l_name,
icon: user.dataValues.icon,
background: user.dataValues.background,
email: user.dataValues.email,
phone: user.dataValues.phone,
fax: user.dataValues.fax,
uv: user.dataValues.uniqueValue
};
return response.redirect('/home');
}
}

在我的app.js中创建了Brain的一个新实例。

const RoutinesModule = require('./routines');
const brain = new RoutinesModule.Brain();

整个事件链从快速POST路线开始:

app.post('/login', function(request, response){
var data = {
Model: 'Users',
where: {where: {email: request.body.email}}
}
brain.db_read(request, response, data, brain.login);
});

请注意,Brain.db_read的回调(最后一个参数)是Brain.login,它是同一构造函数的另一个方法。这就是问题发生的地方。

当对/login的POST请求到达app.js时,它将查询数据库,并将结果提供给任何给定的函数来处理它,在本例中为Brain.login

Brain内部。db_read(),var self=this;作品它指向自己,大脑的实例。然而,当它调用回调Brain.login时,Brain.log内部的语句var self=this;不起作用。它会导致未定义,从而导致错误。

为什么会发生这种情况?为什么var self=this;Brain.login内部导致未定义?

最终,我要做的是创建一组主要函数来处理数据库操作(CRUD),而不是在每个单独的函数中进行数据库操作,这是/可能是不确定的数量。

我可以很容易地在函数定义中只需要该模块,但我强烈希望访问它的属性,以获得动态、可扩展和高效的方式。

谢谢!

您将方法brain.login作为一个没有所有者的函数传递。您只是在传递函数引用。你需要做brain.login.bind(brain)

最新更新