请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

3回答

双越 2019-05-05 16:47:49

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

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

3 回复 有任何疑惑可以回复我~
  • 提问者 AqingCyan #1
    谢谢老师
    回复 有任何疑惑可以回复我~ 2019-05-05 16:48:54
卷狗 2021-02-23 13:45:32

mark

0 回复 有任何疑惑可以回复我~
提问者 AqingCyan 2019-11-09 22:42:25
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 22:50:18
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号