1

nodejs、mongoose、mongodb、expressjs のセットアップがあれば、特定のリクエストを検証するパーミッション/セキュリティ関連のルートがあります。例えば:

permissionUtils.checkStudentWritePermissions = function(req, res, next){
     //load this student from the mongoose db
     //ensure the current user has permission to update this student
}

server.put("/api/student/:studentId/enroll", 
         permissionUtils.checkStudentWritePermissions, function(req, res, next){
     //load student from the database, validate the changes
     //update student in mongodb, send new version back to user 
});

ミドルウェアは、現在のユーザーがあらゆる場合に学生を更新する権利を持っていることを保証するので便利です。(コードの再利用など) どちらの例でも、mongodb から学生をロードしていることに気付くでしょう。この二重読み込みを回避するための受け入れられたパターンはありますか? ある種のリクエスト サイクル キャッシュまたはモデルを渡すための巧妙な方法はありますか?

4

1 に答える 1

1

ここにはさまざまなソリューションがあります。早速、いくつか紹介しようと思います。

1) まず、コードを分離して、ユーザー モデルの関数に実際にフェッチ (および必要な前処理) します。第 2 に、ユーザー モデルがない場合、MVC アプローチを使用すると、コードが大きくなったときにコードを追跡しやすくなります。ここから、最初の呼び出しで応答を簡単にキャッシュし、データベースから再取得せずに 2 番目の呼び出しで返すことができます。Memcached や Redis などを見てください。

2) 慣例ではないかもしれませんが、オブジェクトをミドルウェアからメイン関数に渡すことができます。これを行うことを選択した場合は、ミドルウェアが next(req, res, obj) を呼び出している理由を将来人々が理解できるように、行ったことを明確に文書化し、単に next() に置き換えて「修正」しないでください。

3) 3 番目のアプローチは、オブジェクトを res.locals に保存することです (現在はそう呼ばれていると思います)。これらは、現在のリクエストに対して Express が保持する値です。そこに保存することはキャッシュに似ていますが、そのリクエスト中にのみアクセスできます。後続のリクエストでは、オブジェクトを再取得する必要があります。

これらのオプションのいずれを選択しても、よくアクセスされるオブジェクトに何らかのキャッシュを実装すると、ほとんどすべての状況でアプリケーションが高速化されることに注意してください。

于 2013-03-12T23:04:37.190 に答える