Как обрабатывать дополнительные загрузки файлов мультитера с точки зрения API NodeJS? - PullRequest
0 голосов
/ 21 июня 2019

Я создаю 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
        })
     });
};

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

нашел способ с Promise.all([]):

  // check if file is being uploaded
  var fileQuery = req.file ? Vehicle.findByIdAndUpdate({_id: id}, {$push: {carDoc: ["http://localhost:3000/" + req.file.path]}}) : Promise.resolve();
  // execute any other changes
  var bodyQuery = Vehicle.update({_id: id}, {$set: updateObject })

  // handle single response etc.
  Promise.all([fileQuery, bodyQuery])
  .then(result => {})
0 голосов
/ 21 июня 2019

См. ссылка для мультитера , чтобы понять, как используется значение nter для мультимедиа в Node.JS.

var upload = multer({ dest: 'dest_folder_path/' });

Заполнение будет сохранено в указанном выше месте назначения, а затем в вашем документе обновления кода.путь и затем сохраните его в mongodb.

Измените нижнюю строку кода.

Vehicle.findByIdAndUpdate({_id: id}, {$push: {carDoc: ["http://localhost:3000/" + dest_folder_path/foldername]}}

Это означает, что файл хранится на сервере кодов http://localhost:3000/dest_folder_path

...