关于处理post请求可能存在一个bug

来源:5-3 处理post请求

AqingCyan

2019-05-05

如下示例代码读取数据流,设置了一个上限

const rs = require('fs').createReadStream('text.txt', {highWaterMark: 10})
let data = ''
rs.on('data', chunk => {
  data += chunk
})
rs.on('end', () => {
  console.log(data)
})

因为读取汉字的时候,汉字占位三个字节,如果在读取时采用postData += chunk,在一次读取的数据流到了上限,会截断字节流开始第二次读取,buffer使用toString()转换,可能在上下两次的读取之间刚好截断了三个字节的某个汉字。
例如使用如上示例代码读取一个如下文件

八百标兵奔北坡,北坡标兵并排跑,炮兵怕把标兵碰,标兵怕碰炮兵跑。

会出现如下结果,buffer转换汉字时的字符刚好被截断

八百标���奔北��,北坡标兵并���跑,��兵怕把标兵碰���标兵��碰炮兵跑。

我的解决办法是使用push

let data = []
rs.on('data', chunk => {
  data.push(chunk)
})
rs.on('end', () => {
  let buf = Buffer.concat(data)
  console.log(buf.toString())
})
八百标兵奔北坡,北坡标兵并排跑,炮兵怕把标兵碰,标兵怕碰炮兵跑。
写回答

3回答

双越

2019-05-05

感谢反馈,这是一点确实是我忽略了,你这样处理解决方案肯定是没有问题的。

另外我记得《深入浅出nodejs》也提到过这个问题并且给了接解决方案,现在一时想不起来了,回去再翻翻书。

3
1
AqingCyan
谢谢老师
2019-05-05
共1条回复

卷狗

2021-02-23

mark

0
0

AqingCyan

提问者

2019-11-09

let postData = Buffer.from({})
res.on('data',chunk=>{
    postData = Buffer.concat([postData,chunk])
})
res.on('end',()=>{
    console.log('buf',postData.toString())
})

老师这种方法的话,和上面的逻辑是差不多的,在实际开发中,哪一种更适合呢

0
1
双越
用 Buffer 吧,不存在截断的问题。
2019-11-09
共1条回复

Node.js+Express+Koa2+Nest.js 开发服务端

从入门到实战,一站式掌握 Node.js+Express+Koa2

4051 学习 · 2006 问题

查看课程