如何从NodeJS API角度处理更多的multer文件上载?

时间:2019-06-21 12:23:00

标签: node.js mongodb api mongoose multer

我正在构建与MongoDB对话的NodeJS API。我不知道如何正确处理通过API上传的multer文件。我有一个PATCH路由,该路由可以处理传递给它的所有JSON参数,并根据指定的ID更新文档。

PATCH路线:

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 /任何内容。如您所见,下面的函数检查是否有任何文件被上传,在if下执行ops,然后继续对文档中的其他字段执行更新,因为我最初将其设计为仅处理PATCH请求。因此,如果我只想上传一个新文件并在carDoc数组中创建一个新链接,我最终会收到404响应,因为Vehicle.update函数没有看到我已经将一个新的Weblink推送到了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 :(得分:0)

请参阅multer link了解如何在Node.JS中使用multer npm。

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

答案 1 :(得分:0)

找到了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 => {})