Я работаю над проектом 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(), определенный в прототипе. Но как?
хорошо, но в строке, прежде чем я смогу ее напечатать...
Попробуйте вызвать метод toJSON() в предыдущей строке консоли.
Ребята, я предлагаю вам НЕ доверять console.info, особенно с асинхронным кодом.
Вы можете использовать метод 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;
Он говорит вам, что
this.employeeDetailsSelected.birthDate
не определено.