【问题标题】:File data(Image, pdf) is not getting pushed into the MongoDB array文件数据(图像,pdf)没有被推送到 MongoDB 数组中
【发布时间】:2022-08-18 15:07:58
【问题描述】:

每当我从邮递员上传新文件时,它都会覆盖现有文件并仅保存一个上传的文件。

我尝试过document.push 方法,但它记录了“TypeError:documents.push 不是函数”的错误,但是当我记录console.log(documents)时,它会记录在一个数组中。难道我做错了什么?

处理文件上传的multer函数:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, \"./src/uploads/\");
  },
  filename: function (req, file, cb) {
    cb(
      null,
      file.fieldname + \"-\" + Date.now() + path.extname(file.originalname)
    );
  },
});

var upload = multer({
  storage: storage,
  fileFilter: function (req, file, cb) {
    var filetypes = /jpeg|jpg|png|pdf/;
    var mimetype = filetypes.test(file.mimetype);

    var extname = filetypes.test(path.extname(file.originalname).toLowerCase());

    if (mimetype && extname) {
      return cb(null, true);
    }
    cb(\"Please upload valid file\");
  },
}).array(\"documents\");

uploadDocument 服务文件:

exports.uploadDocuments = async (id, documents, file) => {
  let files = documents.push(file);
  let document = await User.findByIdAndUpdate(
    { _id: id },
    { $set: { documents: files, registration_process_value: 99 } },
    { new: true }
  );
  return document;
};

上传文件的用户控制器:

exports.updateDocuments = catchAsync(async (req, res) => {
  try {
    check_user = await userService.getUser(req.data.id);
    if (!check_user) return res.status(404).json({ message: \"User not found\" });
    if (check_user.registration_process_value >= 4) {
      let uploadDocument = await userService.uploadDocuments(
        check_user.id,
        check_user.documents,
        req.files
      );
      return res.status(200).json({ data: uploadDocument });
    }
  } catch (error) {
    return res.status(400).json({ message: error });
  }
});

文件类型是大批在如下架构中:

documents: {
      type: Array,
    }

documents.push(file) 正在返回一个数字(例如,如果我 console.log(files) 在从邮递员发送请求后返回“文件 - > 2”)。它不是推送文件的实际数据。

  • 还请发布您的 User 架构。
  • 早些时候它是 [String] 但现在它是 documents: { data: Buffer, contentType: String, },
  • 请将完整架构添加到您的问题中。
  • 我已经更新了这个问题。请通过它并指导我。
  • 您应该阅读有关subdocuments 的文档。架构中documents 的声明无效。此外,您不能(真的)像那样在 MongoDB 中存储图像(或二进制)数据。阅读this 了解更多信息。

标签: node.js mongodb express multer


【解决方案1】:

首先你将一个文件推送到documents 并将数组的新长度存储在files 中:

let files = documents.push(file);

然后将 documents 字段设置为该数组长度:

  let document = await User.findByIdAndUpdate(
    { _id: id },
    { $set: { documents: files, registration_process_value: 99 } },
    { new: true }
  );

我假设您要存储实际的数组:

{ $set: { documents: documents, registration_process_value: 99 } }

我建议不要使用$set 替换整个文档数组,而是使用$push

{
  $set:  { registration_process_value: 99 },
  $push: { documents : file }
}

编辑:如果file 实际上是一个文件对象数组,而不是单个对象,事情会发生一些变化。

如果您仍想使用push

documents.push(...file);

使用$push,您需要使用$each

{
  $push : { documents : { $each : file } }
}

【讨论】:

  • 好的,它正在工作,但这里的小问题我想将它存储为一个对象数组,而不是对象数组( [ [ { }, { } ] ] )
  • 如果file 是一个数组,事情就会改变。请参阅我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
相关资源
最近更新 更多