请教: 以二进制方式上传文件,并希望在 express 捕获上传进度,如何通过 nginx 中转

360 天前
 humbass

下面是一个文件上传的 express demo, 文件以二进制方式上传

import fs from 'node:fs'
import express from 'express'
import stream from 'progress-stream'

const port = 3000
const app = express()

app.post('/upload', function (req, res) {
 const length = req.headers['content-length']
 const str = stream({
   length,
   time: 100,
 })
 str.on('progress', (process) => {
   let percent = process.percentage | 0
   // 这里可以打印进度
   console.log(`percent`, percent)
 })
 req.pipe(str).pipe(fs.createWriteStream(`test.mp4`))
 req.on('end', async () => {
   res.status(200).end('ok')
 })
})

server.listen(port, () => {
 console.log('server start at ' + port)
})

此时,如果前端直接通过 3000 端口与 express 交互, 流媒体上传的进度可以被正常捕获。

[ 问题 ]:

如果想通过 nginx 服务器转发,应该如何配置呢?

目前简单如下配置,nginx 将在文件完整接收后一次性发送给 express ,也就是说 express 无法捕获上传进度

location / {
    client_max_body_size 100m;
    proxy_pass http://127.0.0.1:3000/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
1305 次点击
所在节点    Node.js
2 条回复
ysc3839
360 天前
把 nginx proxy buffer 关掉?不过这么做的话如果处理速度过慢,上传速度也会受到限制。
humbass
360 天前
@ysc3839 谢谢,查了下确实有 proxy_buffering on | off 参数,明天试试看。慢就慢一些,主要是希望通过 nginx 挂证书。目前证书直接挂在 express 下 :(

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1004559

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX