【问题标题】:How to handle additional multer file uploads from a NodeJS API perspective?如何从 NodeJS API 的角度处理额外的 multer 文件上传?
【发布时间】:2019-06-21 22:12:03
【问题描述】:

我正在构建一个与 MongoDB 对话的 NodeJS API。我无法弄清楚如何通过 API 正确处理 multer 文件上传。我有一个 PATCH 路由,它处理传递给它的任何 JSON 参数并根据指定的 Id 更新文档。

补丁路由:

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 访问文件,那么指定文档中的数组是 @ 987654324@ 更新为新上传的图像/pdf/whatever 的网络链接。正如您所看到的,下面的函数检查是否有任何文件正在上传,执行 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
        })
     });
};

【问题讨论】:

    标签: node.js mongodb api mongoose multer


    【解决方案1】:

    请参阅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

    【讨论】:

    • 我已经整理好了,我的上传工作正常了。我在问我是否可以结合我正在做的两个查询来接收一个回复。谢谢
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-06-26
      • 2016-05-19
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多