Я пытаюсь зарегистрировать и сохранить все события, происходящие в сеансе пользователя.
Для этого у меня есть массив
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)
Как я могу сохранить весь объект события со всеми его свойствами?
const handleEvent = e => { e.date = new Date(); events.push(e);Я имею в виду, что он просто добавляет текущую дату и вставляет объект в массив.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для этого может быть несколько причин. Скорее всего, эти свойства не являются перечисляемыми, что приводит к тому, что они не включаются в JSON. (Свойства определяются как enumerable через Object.defineProperties.) См.:
Я бы рекомендовал явно объявить, какие свойства вы хотите POST, так как вам, вероятно, все равно не нужны все они:
axios.post('/api/logger', JSON.stringify(events.map(event=>{
return {
altKey: event.altKey,
bubbles: event.bubbles,
// etc...
}
}));
Да, ему действительно повезло с датой, я только что протестировал и получил только {"isTrusted":true}. Ему также следует опасаться TypeError: cyclic object value ошибок.
Работает отлично. В этом была проблема, эти свойства не перечисляемы, поэтому json.stringify игнорирует их. Спасибо!
Что делает
handleEvent?