Почему я не могу получить доступ к свойству «секунды» этого объекта? Как я могу преобразовать его в дату?

Я работаю над проектом Angular и схожу с ума, пытаясь извлечь дату из объекта.

Я попытаюсь объяснить вам мою точную проблему:

В моем коде у меня есть что-то вроде этого:

  ngOnInit(): void {
    this.employeeService.currentMessage.subscribe(employee => {
                                                      console.info("EMPLOYEE: ", employee);
                                                      

                                                      this.employeeDetailsSelected = employee;

                                                      console.info("DATE 1: ", this.employeeDetailsSelected.birthDate);
    .................................................................
    .................................................................
    .................................................................
}

Итак, здесь я печатаю значение поля BirthdayDate моего объекта employeeDetailsSelected.

Это распечатает следующее значение:

DATE 1:  
t {seconds: 103244400, nanoseconds: 0}
nanoseconds: 0
seconds: 103244400
__proto__:
    C: ƒ (t)
    isEqual: ƒ (t)
    toDate: ƒ ()
    toJSON: ƒ ()
    toMillis: ƒ ()
    toString: ƒ ()
    valueOf: ƒ ()
    constructor: ƒ t(t, e)
    __proto__: Object

Так это объект, содержащий секунды и наносекунды? Это временная метка?

Мне нужно преобразовать его в объект даты, поэтому я сначала пытался получить доступ к полю секунд этого объекта. Итак, я попытался сделать что-то вроде этого:

console.info("SECONDS: ", this.employeeDetailsSelected.birthDate["seconds"]);

Но при этом мое приложение выходит из строя, и я получаю эти ошибки в своей консоли Chrome:

core.js:4442 ERROR TypeError: Cannot read property 'seconds' of undefined
    at SafeSubscriber._next (employee-details.component.ts:67)
    at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
    at SafeSubscriber.next (Subscriber.js:122)
    at Subscriber._next (Subscriber.js:72)
    at Subscriber.next (Subscriber.js:49)
    at BehaviorSubject._subscribe (BehaviorSubject.js:14)
    at BehaviorSubject._trySubscribe (Observable.js:42)
    at BehaviorSubject._trySubscribe (Subject.js:81)
    at BehaviorSubject.subscribe (Observable.js:28)
    at Observable._subscribe (Observable.js:76)

Я получаю эту точную ошибку после того, как вставляю этот второй console.info после предыдущего.

console.info("SECONDS: ", this.employeeDetailsSelected.birthDate["seconds"]);

удаление этой строки работает.

Я подумал, что, возможно, я смогу использовать метод toDate(), определенный в прототипе. Но как?

Он говорит вам, что this.employeeDetailsSelected.birthDate не определено.

charlietfl 20.12.2020 20:10

хорошо, но в строке, прежде чем я смогу ее напечатать...

AndreaNobili 20.12.2020 20:12

Попробуйте вызвать метод toJSON() в предыдущей строке консоли.

charlietfl 20.12.2020 20:13

Ребята, я предлагаю вам НЕ доверять console.info, особенно с асинхронным кодом.

MisaelSab 20.12.2020 20:57
Поведение ключевого слова "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) для оценки ваших знаний,...
1
4
123
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать метод toDate(), определенный для proto, непосредственно для вашего объекта, потому что он наследует его от proto. Попробуйте this.employeeDetailsSelected.birthDate.toDate(). Также убедитесь, что эта строка находится в том же месте, где была ваша предыдущая (у которой не было проблем с доступом к birthDate).

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

Обратите внимание на отладку с помощью console.info, особенно при подписке на Observable. Это не правильный способ сделать это.

Помните: вы подписываетесь this.employeeService.currentMessage и следите за изменениями значений.

Исключение очевидно, в этот момент вы пытаетесь получить доступ к свойству seconds ваш объект undefined:

core.js:4442 ERROR TypeError: Cannot read property 'seconds' of undefined
at SafeSubscriber._next (employee-details.component.ts:67)
at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
at SafeSubscriber.next (Subscriber.js:122)
at Subscriber._next (Subscriber.js:72)
at Subscriber.next (Subscriber.js:49)
at BehaviorSubject._subscribe (BehaviorSubject.js:14)
at BehaviorSubject._trySubscribe (Observable.js:42)
at BehaviorSubject._trySubscribe (Subject.js:81)
at BehaviorSubject.subscribe (Observable.js:28)
at Observable._subscribe (Observable.js:76)

Чтобы решить эту проблему, сначала убедитесь, что объект не является undefinedзатем вы можете получить доступ к его свойствам без исключений JS.

например.

var dateValue= this.employeeDetailsSelected.birthDate ? this.employeeDetailsSelected.birthDate.toDate() : null;

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