Sesi Ekspres tidak disimpan saat menggunakan $.ajax({});

Persis seperti yang dikatakannya. Saya mencoba menyimpan beberapa data dalam sesi Express, dan Express tampaknya memperlakukan setiap permintaan AJAX sebagai sesi terpisah, sehingga tidak menyimpan data saya.

Pada klien

$.ajax({
  url: '/orders',
  method: 'post',
  data: { item: item }
});

Di server

router.post('/orders', function(req, res) {
  var sess = req.session,
      order = sess.order || [],
      item = req.body.item || '',
      quantity = req.body.quantity || 1;

  if (!item) return res.status(404).end();

  if (order[item]) {
    order[item] += quantity;
  } else {
    order[item] = quantity;
  }

  //save our order to the session
  req.session.order = order;
  req.session.save();
  console.log(req.session.order); // verified that req.session.order is set

  return res.status(200).end();
});

Ini BUKAN permintaan CORS - ini saya yang mengakses server lokal saya dari klien yang berjalan secara lokal.


person sent1nel    schedule 15.01.2015    source sumber
comment
apakah Anda memiliki panggilan balik .success?   -  person scniro    schedule 15.01.2015
comment
Saya tidak percaya itu penting, tetapi meskipun saya memilikinya, perilakunya tetap sama.   -  person sent1nel    schedule 15.01.2015
comment
Saya percaya bahwa string sesi harus dikirim dengan permintaan ajax ke server. Misalnya, di header Cookie HTTP. Apakah itu? Terkadang permintaan AJAX berfungsi dengan ekstensi Tukang Pos tetapi tidak dalam aplikasi. Bisakah Anda mencoba menggunakan Tukang Pos?   -  person Daniel Kmak    schedule 15.01.2015
comment
Yang cukup menarik, jika tipe variabel sesi Anda adalah array, ia tidak menyimpan isinya. Yang harus saya lakukan hanyalah mengatur perubahan order = sess.order || [] menjadi order = sess.order || {}   -  person sent1nel    schedule 15.01.2015
comment
apakah kamu punya connection.sid cookie di sisi klienmu?   -  person Sergio Ivanuzzo    schedule 25.10.2016


Jawaban (2)


Menambahkan kode di bawah ini ke konfigurasi $.ajax Anda dapat menyelesaikan masalah:

$.ajax({
  xhrFields: {
    withCredentials: true
  },
  ... // other settings
})
person Sergio Ivanuzzo    schedule 25.10.2016

Menggunakan pengambilan berhasil untuk saya, seperti di bawah ini

fetch(url, { credentials: 'include',
             method: 'post',
             ...// other fetch configs
}).then(onsuccesscallback)

Kuncinya adalah menyertakan kredensial saat mengonfigurasi pengambilan

person njmwas    schedule 06.05.2017