Multer - req.file всегда неопределен - PullRequest
0 голосов
/ 21 сентября 2019

Скажите, у меня есть следующая схема:

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.

...