微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

busboy-bodyparser 更改了我的请求,以便 GridFsStorage 不会在 mongodb

如何解决busboy-bodyparser 更改了我的请求,以便 GridFsStorage 不会在 mongodb

我是一名前端开发人员,正在努力拓宽我的视野,并制作将成为 MERN 应用程序的东西。我正在努力将图片上传到 mongodb。

首先我使用了 express bodyparser:

app.use(express.urlencoded({ extended: true }));app.use(express.json());

像这样使用时,我设法上传文件,并且上传文件显示在 MongoDB Compass 中。

我发现这不支持 multipart/form-data,所以我将 bodyparser 更改为 busboy-bodyparser,以便我可以访问表单数据和正在上传文件。所以我把bodyparser改成了:

app.use(busboyBodyParser());

现在它不会将请求数据上传到 mongodb。

我的上传控件如下所示:

const upload = require("../middleware/upload");

const uploadFile = async (req,res) => {
  try {
    req.file = req.files.file;

    await upload(req,res);

    if (req.file == undefined) {
      return res.send(`You must select a file.`);
    }

    return res.send(`File has been uploaded.`);
  } catch (error) {
    console.log(error);
    return res.send(`Error when trying upload image: ${error}`);
  }
};

module.exports = {
  uploadFile: uploadFile
};

我设置 req.file 等于 req.files.file 的原因是因为 busboy-bodyparser 从 req.files.file 而不是 req.file 发送文件,我认为这个改变会使请求函数正确,它没有。

我的上传中间件如下所示:

const promise = mongoose.connect(mongoURI,{ useNewUrlParser: true,useUnifiedTopology: true });

const conn = mongoose.connection;
let gfs;

conn.once('open',() => {
  gfs = Grid(conn,mongoose.mongo);
  gfs.collection('uploads');
});

//create storage object
const storage = new GridFsstorage({
  db: promise,file: (req,file) => {
    return new Promise((resolve,reject) => {
      crypto.randomBytes(16,(err,buf) => {
        if (err) {
          return reject(err);
        }
        const filename = buf.toString('hex') + path.extname(file.originalname);
        const fileInfo = {
          filename: filename,bucketName: 'uploads',Metadata: {
            title: req.body.title,orientation: req.body.orientation
          }
        };
        resolve(fileInfo);
      });
    });
  }
});

const uploadFile = multer({ storage }).single("file");
var uploadFilesMiddleware = util.promisify(uploadFile);
module.exports = uploadFilesMiddleware;

我相信这是记录的代码 (node:15124) DeprecationWarning: 不推荐使用 Db 类上的事件,并将在下一个主要版本中删除。 (使用 node --trace-deprecation ... 显示警告的创建位置) 这是我不确定如何解决的另一个问题,但这是另一天的另一个问题。

我的最终目标是能够将带有附加元数据(标题和方向)的文件发送到 mongodb。

使用此代码,我可以从上传控件获取文件上传 消息,但在 mongoDB 指南针中没有上传文件/块。上传在使用 express-bodyparser 的文件上传(没有元数据)上效果很好,所以当我将它更改为 busboy-bodyparser 时,我按预期获得了文件和元数据,但它没有加载到数据库中,这导致我相信新的 bodyparser 会更改请求,以便 GridFsstorage 不再识别它并且不会将数据放入数据库中。但坦率地说,我只是在这里推测,我对后端的了解通常非常有限。

我在我相信的表单上使用了正确的加密类型:

<form
  action="/upload"
  method="POST"
  enctype="multipart/form-data">

非常感谢任何提示或解释! 我是后端的完全初学者,所以不要害怕为我拼写它:)

解决方法

我设法修复了它!

我不确定是什么原因造成的,但我相信 req.body-fields 还没有被填充或类似的东西。因此我退出了

          metadata: {
            title: req.body.title,orientation: req.body.orientation
          }

使用:metadata: req.body 就可以了。

对于任何其他可能偶然发现此问题的后端新手,还请记住在 html 中命名您的输入,如下所示:<input name="title" type="text" /> 它是与 html-form 一起提交的名称属性,并给出了req.body,以便您可以访问例如 req.body.title(此处不起作用,但仍然值得了解)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。