Express何时开始读取HTTP请求正文?

Express何时开始读取HTTP请求正文?,express,stream,Express,Stream,当HTTP请求有一个主体时,Express从什么时候开始读取请求主体 具体地说,我有一个端点,看起来像这样(样板省略): app.post('/upload',(req,res)=>{ const output=fs.createWriteStream('example.txt') 需求管道(输出) }) 但我注意到,有时从输出文件的开头就缺少数据;也就是说,似乎在调用处理程序之前已经从请求的主体中读取了一些数据 那么:Express从什么时候开始从请求主体读取?在调用处理程序之前,是否有任何

当HTTP请求有一个主体时,Express从什么时候开始读取请求主体

具体地说,我有一个端点,看起来像这样(样板省略):

app.post('/upload',(req,res)=>{
const output=fs.createWriteStream('example.txt')
需求管道(输出)
})
但我注意到,有时从输出文件的开头就缺少数据;也就是说,似乎在调用处理程序之前已经从请求的主体中读取了一些数据


那么:Express从什么时候开始从请求主体读取?在调用处理程序之前,是否有任何方法阻止该操作?

通过实验,似乎Node/Express在第一次调用('data',…)请求时就开始读取HTTP请求正文

要重新创建实验,请创建一个小型Express应用程序:

const-app=express()
应用程序使用((请求、恢复、下一步)=>{
请求on('data',d=>console.log('data 1:',d))
设置超时(下一步,100)
})
应用程序使用((请求、恢复、下一步)=>{
请求on('data',d=>console.log('data 2:',d))
下一个()
})
app.listen(8000)
并注意,当发送带有正文的请求时,只会记录“数据1”:

$ curl -X POST -d 'hello, world' http://localhost:8000
data 1: <Buffer 68 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21>
然后将记录“数据2”:

$ curl -X POST -d 'hello, world' http://localhost:8000
data 1: <Buffer 68 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21>
$curl-X POST-d“你好,世界”http://localhost:8000
数据2:
这里的重要含义是,在编写从主体读取的中间件时必须小心,因为这可能会导致从主体读取的其他中间件或处理程序获得不正确的数据

为了避免这种情况,可以暂停请求()(请参阅),直到连接了所有适当的中间件:

app.use((请求、恢复、下一步)=>{
req.pause()//console.log('data 1:',d))
设置超时(下一步,100)
})
应用程序使用((请求、恢复、下一步)=>{
请求on('data',d=>console.log('data 2:',d))
要求恢复()//