2016-07-08 2 views
1

Node.js/Express.jsアプリケーションでは、nameプライマリキーが以下のようになるように、以下のES6 AppUserモデルオブジェクトにどのような変更を加える必要がありますか?常にユニークであるか?ES6用ユニークなプライマリキーNode.js/Express.jsモデルオブジェクト

コンテキストとして、ユーザは別のOAuth2認証サーバによって認証されているため、この特定のクライアントNode.js/Express.jsアプリケーションはユーザの情報をローカルデータベースに保存しません。したがって、AppUserインスタンスはメモリ内にのみ存在し、ユーザーに関する一時的な情報の所有者になります。ユーザーがローカルに保持されていないため、MongoDBなどのデータストアに依存してプライマリキーを適用することはできません。

'use strict'; 
module.exports = class AppUser { 
    constructor(name) { 
    this.name = name; 
    } 
    getName() { 
    return this.name; 
    } 
    getSomeOther() { 
    return this.someOther; 
    } 
    setSomeOther(other) { 
    this.someOther = other; 
    } 
} 

そして、ここでは他の場所でアプリ内AppUserの新しいインスタンスをインスタンス化するコードの例です:

ここ

は、テストの目的でthe app/models directory of this GitHub sample appに追加されたappuser.jsファイル、ためのコードです

var AppUser = require("./models/appuser.js"); 
... 
var newUser = new AppUser(uname); 
+0

あなたはどこかのユーザ名を格納する必要があります。 OAuth2認証サーバーでモデルを更新して一意のキーを適用するか、クライアントアプリケーションサーバーからユーザー名を格納するかどうかに関係なく、認証サーバーにアクセスできない場合は、データベースに使用されている各名前を格納し、認証前にdbを照会して一意であることを確認することをお勧めします。 –

+0

@realseanp問題は、Node.jsユーザが、トークンなどのような永続化されてはいけないさまざまな情報を一時的に保存する必要があるということです。あなたのアプローチでは、ユーザ名の主キーだけでなく、永続化する必要のないユーザのための「一時的な」データを保存する他のクラスもあります。これは複雑な修正のようです。 Javaでは、メモリ内のクラスのすべてのインスタンスを単純に取得し、プライマリキーで個々にアクセスする方法があります。クラスのインスタンスを反復するNode.jsの方法はありますか? – FirstOfMany

+0

Expressセッションモジュールhttps://github.com/expressjs/sessionを使用して、セッションにデータを一時的に格納することができます。あなたが言ったように、ユーザー名は永続的に持続する必要があり、それは 'LocalUser'モデルを必要とすると思います。 Expressセッションはデフォルトでセッションをメモリに保存しますが、それは生産には適していないことに注意してください。セッションはデータベースに保存する必要があります(セッション参照を表現する多くのセッションストアモジュールの1つを使用して自動的に行うことができます)。 –

答えて

1

私はバニリアの問題を理解することを提案します。あなただけの名前は、アプリケーションの実行中に一意である場合、あなたはそれだけでアイデアだし、このアイデアはに値するかどう配列もちろん

'use strict'; 
var store = [] 
class AppUser { 
    constructor(name) { 
    if (store.indexOf(name) === -1) { 
     this.name = name; 
     store.push(name) 
    } 
    else { 
     console.log("warning " + name + " already exists"); 
     return; 
    } 
    } 
    getName() { 
    return this.name; 
    } 
} 

var user1 = new AppUser("marco"); 
var user2 = new AppUser("raphaello"); 
var user3 = new AppUser("marco"); 
console.log(user2.getName()); 

run : 
warning marco already exists 
raphaello 

にクラスのインスタンス化のために使用される名前を格納することができ確認したい場合残っている、例外をスローすることは、返却よりインスタンスを中止させる方が良いでしょう。

+0

'marco'が存在するかどうかを確認するために呼び出しコードをチェックし、答えに基づいてその動作を変更しますか?例えば'もしマルコがあれば、ユーザ=マルコ。それ以外の場合は、ユーザー=新規ユーザー(marco) 'となります。私はユーザーオブジェクトを格納するredisを持っていますが、エクスプレス/ノードのメモリにユーザーオブジェクトのキーを保持するのと同じ問題があります。私はAngularクライアントアプリケーションにJWTを送って、その要求がnode.js/Expressサーバーに戻ったときにJWTがRedisキーを見つけるのを助けようとしています。 – FirstOfMany

関連する問題