Я создаю NodeJS API, который говорит с MongoDB. Я не могу понять, как правильно обрабатывать загрузки файлов с помощью API. У меня есть маршрут PATCH, который обрабатывает любые переданные ему параметры JSON и обновляет документ в соответствии с указанным идентификатором.
ПУТЬ:
app.route('/api/Vehicles/:vehicleId')
.patch(upload.single('carFile'),clickHandler.updateId)
Документ:
{
"carDoc": [
"http://localhost:3000/uploadsVehicle/2019-06-21T08:13:04.068Z_X5.jpg",
"http://localhost:3000/uploadsVehicle/2019-06-21T08:38:03.562Z_X5.jpg"
],
"_id": "5d0a039e16bf91332d968b46",
"carNum": "XXX325",
"carManager": "Gzegorz Tomasevic",
"insuranceExp": "2021-06-06T00:00:00.000Z",
"__v": 0
}
Следующая функция прекрасно обрабатывает запросы PATCH, однако, поскольку теперь мне нужно каким-то образом связать файлы с моими документами mongo, я понял, что если к файлу обращается req.file
, то массив в указанном документе, который является carDoc
обновляется веб-ссылкой на недавно загруженное изображение / pdf / что угодно. Как вы можете видеть ниже, функция проверяет, загружаются ли какие-либо файлы, выполняет операции ops в if и продолжает выполнять обновление для других полей в документе, как я изначально разработал, чтобы обрабатывать только запросы PATCH. Поэтому, если я хочу загрузить только новый файл и создать новую ссылку в массиве carDoc
, я получаю ответ 404, так как функция Vehicle.update
не видит, что я вставил новую веб-ссылку в массив carDoc
, Есть ли способ, которым я могу объединить две операции ($ push и $ set), чтобы я мог получить один ответ, который я мог бы обработать правильно? Спасибо!
Обработчик запроса:
// modify doc by id
this.updateId = function (req, res) {
const id = req.params.vehicleId;
const updateObject = req.body;
// if a file is uploaded add path to existing carDoc array
if (req.file) {
Vehicle.findByIdAndUpdate({_id: id}, {$push: {carDoc: ["http://localhost:3000/" + req.file.path]}})
.exec()
.then()
}
// update and error handling
Vehicle.update({_id: id}, {$set: updateObject })
.exec()
.then(doc => {
console.log(doc);
if (doc.n === 0) {
res.status(404).json({message: "document you are trying to modify does not exist."})
}
else {
res.status(200).json({message: id +" document successfully modified.", changes: updateObject})
}
})
.catch(err => {
res.status(500).json({
error: err
})
});
};