无法读取未定义的属性(读取'_id'),但文件已上传到mongodb

问题描述 投票:0回答:1

我已经创建了使用 multer gridfs 上传 mp3 的 API,然后使用 Postman 进行测试。我得到了

无法读取未定义的属性(读取“_id”)

错误,但是我在MongoDB Atlas上检查了

uploads.files
uploads.chunks
,文件已经上传了,这是配置

const storage = new GridFsStorage({
  url: process.env.MONGO_URI,
  file: (req, file) => {
    if (file.mimetype === "audio/mp3" || file.mimetype === "audio/mpeg") {
      return {
        filename: Date.now() + path.extname(file.originalname),
        bucketName: "uploads",
      };
    }
    return console.log("wrong file type:" + file.mimetype);
  },
});

const upload = multer({ storage });
router.post("/track/upload", upload.single("file"), trackController.postTrack);

这是这里的错误:

                              ^

TypeError: Cannot read properties of undefined (reading '_id')
    at GridFSBucketWriteStream.emitFile (D:\nemoth\sound_seed\node_modules\multer-gridfs-storage\lib\gridfs.js:306:31)
    at GridFSBucketWriteStream.emit (node:events:530:35)
    at finish (node:internal/streams/writable:955:10)
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21)

Node.js v22.11.0```
node.js mongodb multer-gridfs-storage
1个回答
0
投票

错误“无法读取未定义的属性(读取'_id')”表明

req.file
在您的
trackController.postTrack
方法中未定义。以下是解决问题的几个步骤:

  1. 检查字段名称:确保 Postman 中的字段名称与您代码中的字段名称相匹配。它应该是文件,因为您正在使用
    upload.single("file")
  2. 日志请求对象:在控制器中添加日志语句以检查文件是否已附加:
console.log(req.file);
  1. 错误处理:在路线中实施错误处理以捕获任何上传问题:
router.post("/track/upload", (req, res, next) => {
  upload.single("file")(req, res, (err) => {
    if (err) return res.status(500).send(err.message);
    trackController.postTrack(req, res);
  });
});
  1. 检查 Multer 版本:确保您使用的是
    multer
    multer-gridfs-storage
    的兼容版本。

如果

req.file
仍未定义,请验证文件是否正确上传以及您的 Postman 请求是否配置正确。

© www.soinside.com 2019 - 2024. All rights reserved.