エクスプレスフレームワークを使用してノードjsにcookieを設定する方法


161

私のアプリケーションでは、エクスプレスフレームワークを使用してCookieを設定する必要があります。次のコードを試してみましたが、Cookieを設定していません。

誰かがこれを行うのを手伝ってくれる?

var express = require('express'), http = require('http');
var app = express();
app.configure(function(){
      app.use(express.cookieParser());
      app.use(express.static(__dirname + '/public'));

      app.use(function (req, res) {
           var randomNumber=Math.random().toString();
           randomNumber=randomNumber.substring(2,randomNumber.length);
           res.cookie('cokkieName',randomNumber, { maxAge: 900000, httpOnly: true })

           console.log('cookie have created successfully');
      });

});

var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(5555);

Cookieが設定されていないことをどのように確認していますか?ブラウザーが取得している応答ヘッダーを確認しましたか?
NilsH 2013

それは...それはクッキーがsusccessfully作成しました」と表示されます手段を設定statement.if @NilsH私は、ログを追加した
サチン

1
OK、それからミドルウェアが呼び出されないか、前のステートメントのいくつかが例外を与えます。
NilsH 2013

「app.use(express.static(__ dirname + '/ public'));」を削除した場合 この行は、Cookieが設定されていることを意味します
sachin 2013

回答:


216

Expressでミドルウェアを使用する順序は重要です。前に宣言されたミドルウェアが最初に呼び出され、リクエストを処理できる場合、後で宣言されたミドルウェアは呼び出されません。

express.staticがリクエストを処理している場合は、ミドルウェアを上に移動する必要があります。

// need cookieParser middleware before we can do anything with cookies
app.use(express.cookieParser());

// set a cookie
app.use(function (req, res, next) {
  // check if client sent cookie
  var cookie = req.cookies.cookieName;
  if (cookie === undefined) {
    // no: set a new cookie
    var randomNumber=Math.random().toString();
    randomNumber=randomNumber.substring(2,randomNumber.length);
    res.cookie('cookieName',randomNumber, { maxAge: 900000, httpOnly: true });
    console.log('cookie created successfully');
  } else {
    // yes, cookie was already present 
    console.log('cookie exists', cookie);
  } 
  next(); // <-- important!
});

// let static middleware do its job
app.use(express.static(__dirname + '/public'));

また、ミドルウェアへのニーズのいずれかの端部(応答を返送することによって)要求は、または次のミドルウェアに要求を渡します。この場合はnext()、Cookieが設定されたときに呼び出して後者を実行しました。

更新

現在のところ、Cookieパーサーは別個のnpmパッケージなので、使用する代わりに

app.use(express.cookieParser());

を使用npm i cookie-parserして個別にインストールし、次のように使用する必要があります。

const cookieParser = require('cookie-parser');
app.use(cookieParser());

また、私はcokkieがクッキーを設定する前に、既存のされているかどうかを確認することができますどのようにもう一つの疑問を持っている
サチン

クッキーがすでに設定されているかどうかを確認する方法を示すために、私の回答を編集しました。
robertklep 2013

1
あなたはおそらくあなたのページにいくつかのJSやCSSファイルを持っています。それらはによって処理されexpress.static、ミドルウェアの後で処理さます。したがって、JSファイルまたはCSSファイルごとに、コードが呼び出されます。
robertklep 2013

1
Cookieを8回設定するのではなく、Cookieがすでに存在していると表示されます。これは予想されることです。
robertklep 2013

13
Cookieパーサーは個別にインストールする必要があることに注意してください。npmjs.com/package/cookie-parserを
ジョシュア

117

Cookieを設定しますか?

res.cookie('cookieName', 'cookieValue')

クッキーを読みますか?

req.cookies

デモ

const express('express')
    , cookieParser = require('cookie-parser'); // in order to read cookie sent from client

app.get('/', (req,res)=>{

    // read cookies
    console.log(req.cookies) 

    let options = {
        maxAge: 1000 * 60 * 15, // would expire after 15 minutes
        httpOnly: true, // The cookie only accessible by the web server
        signed: true // Indicates if the cookie should be signed
    }

    // Set cookie
    res.cookie('cookieName', 'cookieValue', options) // options is optional
    res.send('')

})

こんにちは、あなたは署名されたものを言うことができます:本当ですか?
titoih

cookieを符号として設定するようアドバイスした場合、req.cookieは空を返すことに注意することが重要です。req.signedCookiesからのみ署名付きCookieを取得できます
誰か特別な

38

あなたの質問に正確に答えているわけではありませんが、私が抱えていた問題への答えを探している間に私はあなたの質問に出くわしました。多分それは誰かを助けるでしょう。

私の問題は、Cookieがサーバーの応答に設定されていたが、ブラウザーによって保存されなかったことでした。

サーバーの応答は、Cookieが設定された状態で返されました。

Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT 

これは私がそれを解決した方法です。

fetchクライアント側のコードで使用しました。指定しない場合credentials: 'include' にはfetchオプション、クッキーはどちらも、サーバーに送信されないでも、ブラウザによって保存され、でも、サーバーの応答セットクッキーけれどもされています。

例:

var headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');

return fetch('/your/server_endpoint', {
    method: 'POST',
    mode: 'same-origin',
    redirect: 'follow',
    credentials: 'include', // Don't forget to specify this if you need cookies
    headers: headers,
    body: JSON.stringify({
        first_name: 'John',
        last_name: 'Doe'
    })
})

これが誰かの役に立つことを願っています。


ブラウザで投稿リクエストを検査しましたが、このフィールドは投稿リクエストに対応していませんか?
Sunil Garg

XHRまたはJqueryを使用する場合は、代わりに「withCredentials:true」を使用してください
プラグを抜いてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.