Экспресс-сессия не сохраняется при использовании $.ajax({});

Именно так, как он говорит. Я пытаюсь сохранить некоторые данные сеанса Express, и Express, по-видимому, обрабатывает каждый запрос AJAX как отдельный сеанс, поэтому не сохраняет мои данные.

На клиенте

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

На сервере

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

Это НЕ запрос CORS — я запускаю свой локальный сервер с локально работающего клиента.


person sent1nel    schedule 15.01.2015    source источник
comment
у вас есть обратный вызов .success?   -  person scniro    schedule 15.01.2015
comment
Я не верю, что это имеет значение, но даже когда он у меня есть, поведение такое же.   -  person sent1nel    schedule 15.01.2015
comment
Я считаю, что строка сеанса должна быть отправлена ​​​​с запросом ajax на сервер. Например, в заголовке HTTP Cookie. Это? Иногда запросы AJAX работают с расширением Postman, но не в приложении. Можете ли вы попробовать использовать Postman?   -  person Daniel Kmak    schedule 15.01.2015
comment
Интересно, что если тип переменной сеанса является массивом, он не сохраняет свое содержимое. Все, что мне нужно было сделать, это изменить order = sess.order || [] на order = sess.order || {}.   -  person sent1nel    schedule 15.01.2015
comment
у вас есть connection.sid cookie на стороне вашего клиента?   -  person Sergio Ivanuzzo    schedule 25.10.2016


Ответы (2)


Добавление приведенного ниже кода в конфигурацию ur $.ajax может решить проблему:

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

Использование fetch сработало для меня, как показано ниже

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

Ключ включает учетные данные при настройке выборки

person njmwas    schedule 06.05.2017