【问题标题】:Express multer middleware blocks request on data executionExpress multer 中间件阻止对数据执行的请求
【发布时间】:2023-02-05 20:02:50
【问题描述】:

我需要在上传文件时获取请求进度。

如果我做

app.post('/upload', upload.single('file'), (req,res,next) => {
  req.on('data', ()=> {
    //DO SOMETHING
  )
  //PROCESS MY FILE
})

在本地和 AWS EC2 上:

“DO SOMETHING”方法仅在 multer 中间件完成接收所有文件后执行,因此它不起作用


所以我正在做的是:

app.post('/upload', (req,res,next) => {
  req.on('data', ()=> {
    //DO SOMETHING
  )
  next()

}, upload.single('file'), (req, res, next) => {
  //PROCESS MY FILE
})

本地:

这有效,每当上传一大块文件时都会调用“做点什么”

在 AWS EC2 上

这是行不通的。在 multer 中间件完成接收文件后,同时调用所有“DO SOMETHING”。

为什么会这样?

我如何让它正确触发事件?


PS:文件上传完成后,我尝试将 next() 调用置于数据事件中,但随后 multer 抛出异常

Error: Unexpected end of form at Multipart._final

【问题讨论】:

    标签: node.js amazon-web-services express amazon-ec2 multer


    【解决方案1】:

    由 chatGPT 提供(我在谷歌上搜索了很长时间没有成功......)

    默认情况下,Amazon Web Services (AWS) 弹性负载均衡器 (ELB) 在​​第 7 层(应用程序层)运行并使用缓冲反向代理架构。这意味着当客户端上传大文件时,ELB 会将整个文件存储在其缓冲区中,然后再将其发送到后端实例。这可能导致后端实例仅在文件上传完成后才接收整个文件。

    如果您希望后端实例以流式方式接收上传的文件,您可以在 ELB 上启用代理协议。启用代理协议后,ELB 会在请求中添加一个标头,其中包含客户端的 IP 地址和端口,从而允许后端实例将请求视为直接从客户端发送。这可以帮助您实现大文件上传的实时处理。

    同样默认情况下,ELB 使用“Application Load Balancer”,代理协议仅适用于“Classic Load Balancer”,所以我不得不寻找另一个解决方案

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多