Скажите, у меня есть следующая схема:
let personSchema = new Schema({
personData: {
image: { type: String },
basicInformation: [{
firstName: { type: String },
surname: { type: String },
email: { type: String },
phone: { type: String },
}],
}
})
Как я могу сохранить это в базе данных?В настоящее время я получил почтовый маршрут /new
.По этому маршруту я создаю нового человека для хранения в БД:
const person = new Person({
personData: {
image: req.body.personData.file.path,
basicInformation: req.body.personData.basicInformation,
profile: req.body.personData.profile,
experience: req.body.personData.experience,
education: req.body.personData.education,
skills: req.body.personData.skills,
hobbies: req.body.personData.hobbies
}
});
Проблема заключается в следующей строке:
image: req.body.personData.file.path,
req.file
сейчас (насколько я знаю)навсегда быть неопределенным, потому что файл не определен внутри объекта req.Он определен в объекте req.body.
------------- * РЕДАКТИРОВАТЬ * -------------
Попросили предоставить код для загрузки, вот так: код ниже работает нормально.Чтобы проверить это, я начал с модели изображения с одним полем для изображения.Затем на внешнем интерфейсе, добавив это изображение к FormData
и отправив его на /upload
следующим образом:
await axios.post(urlImage, formData, {
headers: {
"content-type": "multipart/form-data"
}
});
personRoutes.post('/upload', upload.single('file'), (req, res) => {
console.log('BODY: ', req.body.file)
console.log('REQ.FILE.PATH: ', req.file)
const image = new Image({
file: req.file.path,
});
image.save()
.then(result => {
console.log('YES', result)
res.redirect('/projects')
})
.catch(err => {
console.log('KUT', err)
})
});
Итак, снова приведенный выше код все хорошо, работает как шарм.Однако, что если я захочу сохранить БОЛЬШЕ, чем ОДИН образ, например, имя, фамилию и т. Д. Для меня это становится непростым делом, потому что простого добавления изображения к объекту FormData
и его отправки больше не будет достаточно.Мне нужно было бы отправить объект с полями image
, firstname
и lastname
.Таким образом, мой почтовый маршрут будет выглядеть примерно так:
personRoutes.post('/new', (req, res) => {
const person = new Person({
personData: {
image: req.body.personData.file.path,
basicInformation: req.body.personData.basicInformation,
profile: req.body.personData.profile,
experience: req.body.personData.experience,
education: req.body.personData.education,
skills: req.body.personData.skills,
hobbies: req.body.personData.hobbies
}
});
person.save()
.then(result => {
console.log('YES', result)
res.redirect('/projects')
})
.catch(err => {
console.log('KUT', err)
})
});
И на моем интерфейсе мне придется сделать что-то вроде этого:
let testObj = {
file: this.person.personData.image,
firstname: "Reinier",
lastname: "Galien"
}
const formData2 = new FormData();
formData2.append('file', testObj)
И отправить это с помощью axios, проблема в том,что file
теперь живет внутри req.body
.