1. ホーム
  2. node.js

[解決済み】expressフレームワークを使用したnode jsでクッキーを設定するにはどうすればよいですか?

2022-04-09 02:31:04

質問

私のアプリケーションでは、expressフレームワークを使用してクッキーを設定する必要があります。以下のコードを試しましたが、クッキーを設定することができません。

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);

解決方法は?

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());