JSON.stringify потерять свойства - Регистрация и сохранение всех событий javascript

Я пытаюсь зарегистрировать и сохранить все события, происходящие в сеансе пользователя.

Для этого у меня есть массив

var events = []

Наличие слушателя для каждого события.

window.onload = function() {
    window.addEventListener("abort", handleEvent);
    window.addEventListener("blur", handleEvent);
    [...]
}

и отправка событий:

function sendEvents() {
    axios.post('/api/logger', JSON.stringify(events));
}

Проблема в том, что каждый sendEvents() отправляет массив событий, но каждое из них имеет только два свойства:

[{"isTrusted":true,"date":"2019-02-19T14:59:42.474Z"},{"isTrusted":true,"date":"2019-02-19T14:59:42.485Z"}

Но у него должно быть НАМНОГО больше свойств, например:

*altKey: false
bubbles: true
button: 0
buttons: 0
cancelBubble: false
cancelable: true
clientX: 662
clientY: 273
composed: true
ctrlKey: false
currentTarget: null
date: Tue Feb 19 2019 12:08:38 GMT-0300 (hora estándar de Argentina) {}
defaultPrevented: false
detail: 0
eventPhase: 0
fromElement: null
isTrusted: true
layerX: 662
layerY: 273
metaKey: false
movementX: 0
movementY: 0
offsetX: 662
offsetY: 273
pageX: 662
pageY: 273
path: (7) [header.App-header, div.App, div#root, body, html, document, Window]
relatedTarget: null
returnValue: true
screenX: 662
screenY: 400
shiftKey: false
sourceCapabilities: InputDeviceCapabilities {firesTouchEvents: false}
srcElement: header.App-header
target: header.App-header
timeStamp: 1605.000000000473
toElement: header.App-header
type: "mouseover"
which: 1
x: 662
y: 273*

Даже если я не упорядочиваю массив, в бэкэнде объект имеет только те же два атрибута. (я использую nodejs + mongodb)

Как я могу сохранить весь объект события со всеми его свойствами?

Что делает handleEvent?

Pointy 19.02.2019 16:50
const handleEvent = e => { e.date = new Date(); events.push(e);
Darío GL 21.02.2019 00:22

Я имею в виду, что он просто добавляет текущую дату и вставляет объект в массив.

Darío GL 21.02.2019 00:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
194
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этого может быть несколько причин. Скорее всего, эти свойства не являются перечисляемыми, что приводит к тому, что они не включаются в JSON. (Свойства определяются как enumerable через Object.defineProperties.) См.:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description

Я бы рекомендовал явно объявить, какие свойства вы хотите POST, так как вам, вероятно, все равно не нужны все они:

axios.post('/api/logger', JSON.stringify(events.map(event=>{
  return {
    altKey: event.altKey,
    bubbles: event.bubbles,
    // etc...
  }
}));

Да, ему действительно повезло с датой, я только что протестировал и получил только {"isTrusted":true}. Ему также следует опасаться TypeError: cyclic object value ошибок.

Kaddath 19.02.2019 17:01

Работает отлично. В этом была проблема, эти свойства не перечисляемы, поэтому json.stringify игнорирует их. Спасибо!

Darío GL 21.02.2019 00:27

Другие вопросы по теме