NodeJS アプリケーションを構築するためのモジュールを作成したいのですが、少し道に迷っており、この件に関して完全に決定的なものは (何時間もの検索で) 見つかりませんでした。
「ユーザー」モジュールを作成したいとします。このモジュールから、次のようなコードを使用して新しいユーザーを作成できます。
var newUser = new User();
理想的には、次のようなものを使用して、コードの先頭にモジュールが必要です。
var User = require('../lib/user');
これはうまくいきます。問題は、ユーザー モジュールをどのように構成すればよいかということです。次の方法が最善ですか?
module.exports = function User() {
var authorized = false;
var username = undefined;
var password = undefined;
var statistics = undefined;
this.authorized = function() {
return authorized;
}
this.username = function() {
return username;
}
this.statistics = function() {
return statistics;
}
}
さまざまなモジュール変数のゲッターとセッターを作成して、他のコードから誤ってアクセスしたくないものを非表示にできるようにしています。ただし、以前は次のようにしました。
function User() {
this.authStatus = false;
this.email;
this.displayName;
this.inSession;
}
User.prototype.isAuthenticated = function() {
return(this.authStatus && this.email && this.displayName)
}
User.prototype.isInSession = function() {
return(this.inSession && this.isAuthenticated());
}
exports.User = User;
これも機能しますが、注意点が 1 つあります。クロージャー内からユーザー プロパティにアクセスする方法が見つかりません。私の理解が正しければ、2番目の実装ではできません。これは、ユーザーのプロパティを編集するために関数をコールバックとして db ライブラリに渡す必要がある場合、それができないことを意味します。それは次のようになります。
User.prototype.login = function() {
db.doDbStuff('get user data query', function(_error, _result) {
this.username = _result[0].name; //this code will not work
});
}
私の理解では、「this」キーワードはユーザーではなくクロージャーのスコープ内にあるため、コードは機能しません。コードが User 関数内に配置されたとしても、次のようになります。
function User() {
this.login = function() { //you know
それはうまくいきません。
私の質問は、この問題の最善の解決策は何ですか? 最初のコード ブロックで提示した方法ですか? それはかなり面倒で厄介で、変数の衝突が発生しやすいようです。怖いです。
前もって感謝します!