2015-12-18 7 views
3

У меня есть один бронирования объекта называется, и в нем у меня есть несколько свойств, и я хочу продлить с Object.assign, как это:Object.assign не работает, как ожидалось

let data = Object.assign(booking, { 
    hiw: event.hiw[booking.locale], 
    tip: event.tip[booking.locale], 
    start: moment(event.start).format('L') 
}); 

Но когда я печатаю данные , то результат будет тот же объект из источника (бронирование), так hiw, tip и start будут игнорироваться, но ... если я пытаюсь сделать:

let data = Object.assign({}, { 
    hiw: event.hiw[booking.locale], 
    tip: event.tip[booking.locale], 
    start: moment(event.start).format('L') 
}); 

Это будет работать идеально.

Мой вопрос: что я делаю неправильно здесь? Почему я не могу продлить booking, и я могу расширить пустой объект?

Это определенно не проблема с асинхронным кодом, когда я пытаюсь продлить бронирование, он уже существует со всеми свойствами внутри.

Я также пытался использовать символ подчеркивания extend, и поведение в точности то же самое.

+2

Можете ли вы показать, что у вас есть, когда вы печатаете бронирование непосредственно перед вызовом назначить а также после? – jonasnas

+0

Это похоже на работу в Chrome, который (теоретически) использует тот же движок, что и node.js. Являются ли 'hiw',' tip' или 'start' неперечислимыми или собственными свойствами' booking'? https://jsfiddle.net/mikemccaughan/2959resk/ –

+0

Мне интересно, является ли ошибка в задании блока 'let' или в свойствах, которые вы пытаетесь назначить. Я собрал очень легкий макет (https://jsfiddle.net/GentleMaN/h10wwo5h/), и он работает. –

ответ

6

Документы Mongoose (экземпляры моделей) являются специальными: они будут печатать только свойства, которые присутствуют в схеме.

Если свойства не определены там, они не будут отображаться при их console.log() (а также нет, если вы конвертируете документ в простой объект JS с obj.toObject()).

Это означает, что использование Object.assign() будет работать только в том случае, если вы назначаете свойства, которые также присутствуют в схеме. Любые свойства, которые не объявлены, не будут отображаться (или не сохраняться в базе данных).

Если ваше намерение использовать документ для вывода, вы должны преобразовать его в надлежащий объект JS первый перед присвоением ему:

let data = Object.assign(booking.toObject(), { 
    hiw : event.hiw[booking.locale], 
    tip : event.tip[booking.locale], 
    start : moment(event.start).format('L') 
}); 
+0

Теперь работает отлично !!! Благодаря!! –

Смежные вопросы