【问题标题】:Using multer with express and typescript将 multer 与 express 和 typescript 一起使用
【发布时间】:2021-04-24 12:13:01
【问题描述】:

我正在使用 multer 来解析包含文本和图像的表单数据。当我尝试控制台记录我的字段时,它说它们都是未定义的。关于为什么会发生这种情况的任何想法?

这是邮递员的邮寄请求:

const uploadThumbnailArray = [
  { name: 'thumbnail'},
  { name: 'notesId'}
]

app.post("/test_form", upload.fields(uploadThumbnailArray), async (req, res) => {
  try {
    const files = req.files as { [fieldname: string]: Express.Multer.File[] };

    console.log(files['thumbnail'])
    console.log(files['notesId'])
    var notesId: string = req.body.notesId
    const notesRef = admin.firestore().collection("notes_test").doc(notesId);

    res.json({ message: `succesfully uploaded thumbnail ${notesRef.id}` });

  } catch (error) {
    console.log(error);
    res.status(500).send(error);
  }
});

【问题讨论】:

    标签: typescript express multer


    【解决方案1】:

    在这里,您试图从 multer 中间件中获取 notesId。 Multer 只支持二进制文件。

    尝试从 multer 中删除 notesId

    const uploadThumbnailArray = [{ name: "thumbnail", maxCount: 1 }];

    只保留thumbnail 属性。

    const express = require("express");
    const multer = require("multer");
    const app = express();
    const port = 3000;
    
    app.use(express.json());
    
    var upload = multer({
      dest: "uploads/",
      preservePath: true
    });
    
    app.get("/", (req, res) => {
      res.status(200).send("Hello world");
    });
    
    const uploadThumbnailArray = [{
      name: "thumbnail",
      maxCount: 3
    }];
    
    /* 
    //You can use this
    app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
      // req.files is array of `photos` files
      // req.body will contain the text fields, if there were any
    })
    
    */
    
    //Upload route
    app.post("/upload", upload.fields(uploadThumbnailArray), (req, res, next) => {
      try {
        console.log(req.body);
        console.log(req.files);
        return res.status(201).json({
          message: "File uploaded successfully",
        });
      } catch (error) {
        console.error(error);
      }
    });
    
    app.listen(port, () =>
      console.log(`Hello world app listening on port ${port}!`)
    );

    现在尝试运行这个应用程序并进行测试,

    现在控制台req.files

    从这里您可以访问存储位置和文件详细信息以保存在数据库中

    【讨论】:

    • 我尝试了这个修复,两个字段都记录为[Object: null prototype] {}。然后我尝试了这篇中等文章article,但得到了相同的结果。我的快速配置与文章大致相同(期待 start() 的事情)。
    • 你用过这个中间件吗? app.use(express.json());
    • 是的。然后我开始使用 body parser + multer 上传表单数据,根据媒体文章。我认为问题可能是打字稿,但我真的不想回到 javascript。
    • 我不这么认为 TypeScript 的问题。您应该再次检查代码
    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2012-09-24
    • 1970-01-01
    • 2019-09-23
    • 2020-01-14
    • 2022-09-29
    • 2020-04-30
    • 2020-04-17
    相关资源
    最近更新 更多