关于处理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》也提到过这个问题并且给了接解决方案,现在一时想不起来了,回去再翻翻书。
312019-05-05 -
卷狗
2021-02-23
mark
00 -
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()) })
老师这种方法的话,和上面的逻辑是差不多的,在实际开发中,哪一种更适合呢
012019-11-09
相似问题