Bagaimana cara mengatur cookie di simpul js menggunakan kerangka kerja ekspres?


161

Dalam aplikasi saya, saya perlu mengatur cookie menggunakan framework express. Saya telah mencoba kode berikut tetapi tidak mengatur cookie.

Adakah yang bisa membantu saya melakukan ini?

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

Bagaimana Anda memverifikasi bahwa cookie tidak disetel? Sudahkah Anda memeriksa header respons yang didapat browser?
NilsH

@NilsH saya telah menambahkan log statement.if jika diatur berarti akan ditampilkan sebagai 'cookie telah dibuat secara susccessfully' ..
sachin

1
ok, maka middleware Anda tidak dipanggil, atau beberapa pernyataan sebelumnya memberikan pengecualian.
NilsH

jika saya menghapus 'app.use (express.static (__ dirname +' / public '));' baris ini berarti mengatur cookie
sachin

Jawaban:


216

Urutan di mana Anda menggunakan middleware dalam hal-hal Express: middleware yang dideklarasikan sebelumnya akan dipanggil terlebih dahulu, dan jika itu dapat menangani permintaan, middleware apa pun yang dinyatakan kemudian tidak akan dipanggil.

Jika express.staticmenangani permintaan, Anda perlu memindahkan middleware Anda:

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

Juga, kebutuhan middleware untuk kedua ujung permintaan (dengan mengirim kembali respon), atau lulus permintaan ke middleware berikutnya. Dalam hal ini, saya telah melakukan yang terakhir dengan menelepon next()ketika cookie telah diatur.

Memperbarui

Sampai sekarang cookie parser adalah paket npm yang terpisah, jadi alih-alih menggunakan

app.use(express.cookieParser());

Anda perlu menginstalnya secara terpisah menggunakan npm i cookie-parserdan kemudian menggunakannya sebagai:

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

juga saya punya satu pertanyaan lagi bagaimana saya bisa mengecek apakah cokkie ada atau tidak sebelum mengatur cookie
sachin

Saya mengedit jawaban saya untuk menunjukkan kepada Anda cara memeriksa apakah cookie sudah diatur.
robertklep

1
Anda mungkin memiliki beberapa file JS dan / atau CSS di halaman Anda. Itu akan ditangani oleh express.static, yang akan menanganinya setelah middleware Anda. Jadi untuk setiap file JS atau CSS, kodenya akan dipanggil.
robertklep

1
Itu tidak mengatur cookie 8 kali, itu mengatakan cookie sudah ada. Yang diharapkan.
robertklep

14
Perhatikan bahwa pengurai cookie sekarang harus diinstal secara terpisah. Lihat npmjs.com/package/cookie-parser
Joshua

118

Setel Cookie?

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

Baca Cookie?

req.cookies

Demo

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

})

hai, dapatkah Anda mengatakan apa yang ditandatangani: benar?
titoih

jika Anda telah menyarankan untuk menetapkan cookie sebagai tanda, penting untuk dicatat bahwa req.cookie akan kembali kosong. Anda hanya dapat mengambil cookie yang ditandatangani dari req.signedCookies
Seseorang Khusus

38

Tidak persis menjawab pertanyaan Anda, tetapi saya menemukan pertanyaan Anda, sambil mencari jawaban untuk masalah yang saya miliki. Mungkin itu akan membantu orang lain.

Masalah saya adalah cookie diatur dalam respons server, tetapi tidak disimpan oleh browser.

Respons server kembali dengan cookie yang ditetapkan:

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

Ini adalah bagaimana saya menyelesaikannya.

Saya menggunakan fetchkode sisi klien. Jika Anda tidak menentukan credentials: 'include' dalam fetchopsi, cookie tidak dikirim ke server atau disimpan oleh browser, meskipun respons server menetapkan cookie.

Contoh:

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'
    })
})

Saya harap ini membantu seseorang.


Saya telah memeriksa permintaan posting saya di browser tetapi bidang ini tidak sesuai dengan permintaan posting?
Sunil Garg

Jika menggunakan XHR atau Jquery, gunakan 'withCredentials: true' bukan
unplugged

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.