Bagaimana mengakhiri sesi di ExpressJS

89

Saya merasa ini harus dikubur di suatu tempat di dokumentasi, tetapi saya tidak dapat menemukannya.

Bagaimana Anda menutup atau mengakhiri atau mematikan (apa pun) sesi di ExpressJS?

Stephen
sumber

Jawaban:

125

Express 4.x Jawaban yang Diperbarui

Penanganan sesi tidak lagi dibangun di Express. Jawaban ini mengacu pada modul sesi standar: https://github.com/expressjs/session

Untuk menghapus data sesi, cukup gunakan:

req.session.destroy();

Dokumentasi agak tidak berguna dalam hal ini. Ia mengatakan:

Menghancurkan sesi, menghapus req.session, akan menghasilkan kembali permintaan berikutnya. req.session.destroy(function(err) { // cannot access session here })

Ini tidak berarti bahwa sesi saat ini akan dimuat ulang pada permintaan berikutnya. Ini berarti sesi kosong bersih akan dibuat di penyimpanan sesi Anda pada permintaan berikutnya. (Agaknya ID sesi tidak berubah, tapi saya belum mengujinya.)

Brad
sumber
apakah ada cara untuk menghancurkan sesi dari sesi dan bukan dari permintaan langsung. Misalnya jika saya mengimplementasikan log me out dari semua fungsionalitas perangkat, saya memerlukannya
Muhammad Umer
1
@MuhammadUmer Sejauh yang saya tahu, tidak ada mekanisme bawaan untuk menghancurkan sesi arbitrer. Anda dapat menerapkannya sendiri dengan mudah dengan menghapus kunci yang terkait dengan sesi dari penyimpanan, atau dengan membuat pembungkus sesi Anda sendiri.
Brad
94

Sudahlah, itu req.session.destroy();

Stephen
sumber
8
Ini tidak berfungsi untuk saya di express 3 .. Saya mencoba menelepon ´req.session.destroy () ´
acidghost
6
Bekerja dengan baik untuk saya di ExpressJS 3.00. Digunakan req.session.destroy();seperti yang dilakukan acidghost.
hexacyanide
1
penggunaan req.session.destroy () juga berfungsi untuk saya di express 2.5
TulioPa
1
Dimana ini didokumentasikan? Saya mencoba untuk menemukannya.
huggie
25

Pertanyaan tersebut tidak menjelaskan jenis penyimpanan sesi apa yang digunakan. Kedua jawaban tersebut tampaknya benar.

Untuk sesi berbasis cookie:

Dari http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

Untuk Redis, sesi berbasis dll:

req.session.destroy // Deletes the session in the database.
Blueshirts
sumber
1
req.session.destroy pada dasarnya adalah pembungkus untuk "delete req.session", lihat kode sumbernya di sini: github.com/expressjs/session/blob/master/session/session.js
tfmontague
7

menggunakan,

delete req.session.yoursessionname;
Nithin
sumber
Saya sangat ingin melihat dokumen tentang ini.
Malas
5
Untuk semua @Nithin yang memberikan suara rendah; metode-fungsi session.destroy () seperti yang didokumentasikan di github (github.com/expressjs/session/blob/master/session/session.js) menggunakan "hapus this.req.session" - ini bukan jawaban @ Nithin, tetapi menggunakan "hapus" adalah solusi yang tepat juga (dan tidak tercakup dalam jawaban lain).
tfmontague
Apakah ini solusi yang tepat? Tidak ada kebocoran memori, hal-hal nakal tidak akan terjadi bukan?
Rajath
6

Session.destroy (panggilan balik)

Menghancurkan sesi dan akan membatalkan pengaturan properti req.session. Setelah selesai, callback akan dipanggil.

Cara aman ↓ ✅

req.session.destroy((err) => {
  res.redirect('/') // will always fire after session is destroyed
})

Cara tidak aman ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done
Hasan Sefa Ozalp
sumber
5

Menggunakan req.session = null;, tidak akan benar-benar menghapus instance sesi. Solusi yang paling tepat adalah req.session.destroy();, tetapi ini pada dasarnya adalah pembungkus untuk delete req.session;.

https://github.com/expressjs/session/blob/master/session/session.js

Session.prototype.destroy = function(fn){
  delete this.req.session;
  this.req.sessionStore.destroy(this.id, fn);
  return this;
};
tfmontague
sumber
0
req.session.destroy(); 

Di atas tidak berhasil untuk saya, jadi saya melakukan ini.

req.session.cookie.expires = new Date().getTime();

Dengan mengatur kedaluwarsa cookie ke waktu saat ini, sesi berakhir dengan sendirinya.

John Quasar
sumber
-5

Seperti disebutkan di beberapa tempat, saya juga tidak bisa membuat fungsi req.session.destroy () bekerja dengan benar.

Ini adalah pekerjaan saya .. tampaknya melakukan trik, dan masih memungkinkan req.flash digunakan

req.session = {};

Jika Anda menghapus atau menyetel req.session = null; , tampaknya Anda tidak dapat menggunakan req.flash

Gene Bo
sumber
1
Ini adalah masalah keamanan, karena tidak mengubah hash sesi
Tosh