ここに私が持っている状況です。私は多くのプロパティとメソッドを持つコンストラクタ関数を持っています。ここでのプロパティは次のとおりです。メソッドの数が定義されているJavaScript - var self = this;自己は定義されていません
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);
});
}
れるもの - コールバック関数が常にあります同じコンストラクタ関数の別のメソッドになります。私app.jsで
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');
}
}
脳の新しいインスタンスが作成されます。ここでは、コールバックになります別の方法です。 Brain.db_readのコールバック、最後のパラメータは、別の方法であるBrain.login、であることを
app.post('/login', function(request, response){
var data = {
Model: 'Users',
where: {where: {email: request.body.email}}
}
brain.db_read(request, response, data, brain.login);
});
は注意:イベントのチェーン全体が明示POSTルートから開始
const RoutinesModule = require('./routines');
const brain = new RoutinesModule.Brain();
同じコンストラクタ。問題が発生している場所がここにあります。
/login
へのPOSTリクエストがapp.jsをヒットすると、Brain.db_readの内部
Brain.login
()この場合には、それを処理するために、任意の関数に結果をデータベースに照会し、与えるために起こっています、var self = this;働くそれはBrainのインスタンスであることを示します。ただし、Brain.loginのコールバックを呼び出すと、Brain.loginの内部のステートメント、var self = this;動作しません。定義されていないため、エラーが発生します。どうしてですか?なぜvar self = thisですか? Brain.loginの中に定義されていませんか?
最終的に私がしようとしているのは、個々の関数の内部でデータベース操作を行うのではなく、データベース操作(CRUD)を処理するための主要な関数のセットを作成することです。
私はそのモジュールでその機能定義を簡単に要求できますが、動的、スケーラブル、および効率的な手段として、そのプロパティにアクセスすることを強くお勧めします。
ありがとうございます!
あなたが作成した 'self'変数は' console.log(obj) 'と' callback(request、response、obj) 'を呼び出すそのコールバック関数のスコープに入ります。たとえば、 'callback.call(self、request、response、obj)'を使用することができます。しかし、そのスコープの 'self'は、' login'メソッドの範囲で魔法のように利用できなくなります。 – Bergi