4

Express.JS を使用して静的コンテンツを提供します。

express.use(express.static('./../'));

が提供されたらindex.html、ユーザーがサインインしているかどうかを示す応答と一緒に Cookie を送信したいと思います。通常は使用する必要がありますres.cookie()が、静的に提供されるコンテンツに使用する方法がわかりません。

4

3 に答える 3

8

なぜこれを行う必要があるのか​​ はわかりませんが、staticモジュールの前に独自のミドルウェアを配置できます。

次のクイックハックが機能するはずです。

function attach_cookie(url, cookie, value) {
  return function(req, res, next) {
    if (req.url == url) {
      res.cookie(cookie, value);
    }
    next();
  }
}

app.configure(function(){
  app.use(attach_cookie('/index.html', 'mycookie', 'value'));
  app.use(express.static(path.join(__dirname, 'public')));
});

上記は、ミドルウェアの前に、ミドルウェア Express の使用のチェーンに別の関数を挿入しstaticます。URL が探している特定の URL と一致する場合、新しいレイヤーは Cookie を応答に添付し、チェーンのさらに下に応答を渡します。

于 2013-01-15T19:30:20.197 に答える
1

次のアプローチも検討してください。

  1. Express が Web サーバーの背後にある場合、Express を気にせずに静的ファイルを提供できます。ミドルウェア経由よりも高速なはずです。nginx を使用している場合は、Nginx Reverse Proxying to Node.js with Rewriteが役に立ちます。

  2. 静的ファイルに JavaScript が含まれていると仮定すると、この Cookie に必要なデータのみを明示的に要求するだけで、クライアント側で Cookie を直接設定することもできます。

    document.cookie = "user_id=" + user_id;
    

    Flanagan の JS 決定版ガイド (第 6 版!) には、クライアント側の JavaScript で Cookie を使用する方法が詳しく説明されています ( JavaScript の書籍の中で最高のものであることに加えて:)。

些細なアドバイスかもしれませんが、私は次のフローを見てきました (複数回): クライアントが API リクエストを送信し (これには明らかに Cookie が添付されています)、サーバーは Cookie からデータを取得し、このクッキーに含まれるデータ。クライアントでこの Cookie を静かに読み取るのではなく、これらすべてを行います。基本的に、クライアントはサーバーに独自の Cookie に何が含まれているかを尋ねます。

あなたのシナリオでは、user_id/access_key を 1 回だけ要求してから、常にクライアントの Cookie をチェックし、クライアントがまだ持っていないデータについてのみサーバーにアクセスする必要がありますが、セッション状態を保存してチェックし、おそらくいくつかのコンパクトほとんどのページで使用されるデータ (ユーザー名など) をローカルの Cookie に保存します (データをローカル ストレージにキャッシュして、サーバーの負荷をさらに軽減することもできます)。この場合、express は、ユーザーが誤ってページを更新したかどうかさえ認識できません (もちろん、アプリケーションの状態を反映するように URL を変更しない場合、または # 部分のみを変更した場合)。

于 2013-01-16T16:14:11.797 に答える