Почему возникает ошибка:
Несоответствие между тем, что есть в вашей схеме, и тем, что вы пытаетесь сохранить в базе данных. В частности, profilePic
в вашей схеме определяется как:
profilePic: { type: Buffer, contentType: String }
Обратите внимание, что mon goose проигнорирует свойство contentType
, поскольку это недопустимый вариант для типа Buffer
. Почему пн goose рассматривает contentType
как вариант? спросите вы; это потому, что когда Mon goose находит вложенное свойство с именем type
в вашей схеме, Mon goose предполагает, что ему необходимо определить SchemaType с заданным типом, а все остальные свойства в объекте рассматриваются Параметры SchemaType для этого типа. Вы можете узнать больше о ключе type
здесь .
В конечной точке post /profile-pic/:id
вы пытаетесь сохранить это:
profilePic: {
data: fs.readFileSync(files.profilePic.path),
contentType: files.profilePic.type
}
Mon goose попытается преобразовать объект, который вы пытаетесь сохранить, в то, что было указано в схеме (буфер), однако он не может этого сделать, и поэтому вы получаете CastError
.
Исправление:
- Если это вариант, удаление свойства
contentType
в схеме и непосредственное сохранение значения буфера было бы простым исправлением. Схема становится примерно такой:
profilePic: { type: Buffer }
И сохранение становится примерно таким:
profilePic: fs.readFileSync(files.profilePic.path),
теперь, profilePic
будет содержать значение буфера изображения.
Однако, я предполагаю, что причина, по которой у вас было свойство
contentType
в первую очередь, заключалась в намеренном сохранении
contentType
значения буфера, если вас все еще интересует этот фрагмент данных, вам придется обновить свой схема, чтобы создать для него пространство, примерно так:
profilePic: {
data: { type: Buffer },
contentType: String
}
Обратите внимание, что, в отличие от ранее, contentType не объявлен как опция для типа Buffer, скорее, это вложенное свойство с собственным типом .
Теперь вы можете go заранее сохранить данные profilePic
, как вы делали раньше:
profilePic: {
data: fs.readFileSync(files.profilePic.path),
contentType: files.profilePic.type
}