2017-02-10 16 views
0

ここに私が持っている状況です。私は多くのプロパティとメソッドを持つコンストラクタ関数を持っています。ここでのプロパティは次のとおりです。メソッドの数が定義されている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)を処理するための主要な関数のセットを作成することです。

私はそのモジュールでその機能定義を簡単に要求できますが、動的、スケーラブル、および効率的な手段として、そのプロパティにアクセスすることを強くお勧めします。

ありがとうございます!

+0

あなたが作成した 'self'変数は' console.log(obj) 'と' callback(request、response、obj) 'を呼び出すそのコールバック関数のスコープに入ります。たとえば、 'callback.call(self、request、response、obj)'を使用することができます。しかし、そのスコープの 'self'は、' login'メソッドの範囲で魔法のように利用できなくなります。 – Bergi

答えて

3

所有者のない関数としてbrain.loginというメソッドを渡しています。あなたは関数参照を渡すだけです。あなたはbrain.login.bind(brain)をする必要があります。

+0

うわー、毎日新しいものを学ぶ。ありがとう!これはすべてを解決しました!コールバックパラメータを扱うときに関数のオーナーを定義する一般的なアプローチはそうですか?コールバックの所有者にしたいオブジェクトで.bind()を追加するだけです。 – ryanwaite28

+0

超高速応答! A + – ryanwaite28

+0

の 'bind'は、これらのシナリオでうまく機能します。 'this'または' new'を使用しない方がより効果的です。 –

関連する問題