Node.js中Form-data提交后如何解析服务器返回数据?
解决Node.js提交form-data后无法解析响应数据的问题
你已经能收到服务器的响应状态码,但拿不到具体内容对吧?这是因为Node.js里的HTTP响应本质是可读流,不会直接把完整数据一次性返回给你,得手动把流里的片段拼接起来才行。给你两种常用的解决方法:
方法一:手动监听流事件(无需额外依赖)
直接修改你的回调函数,通过data事件收集数据片段,end事件处理完整数据:
form.append('location', location); form.append('name', nameList); form.submit('/', function(err, res) { console.log("upload_files") console.log("************") if (err) { return console.error('upload failed:', err); } else{ console.log('file_upload:', res.statusCode) // 用来存储完整的响应数据 let responseData = ''; // 每收到一段数据就拼接到responseData里 res.on('data', (chunk) => { responseData += chunk; }); // 所有数据接收完成后处理 res.on('end', () => { console.log('服务器返回的完整数据:', responseData); // 如果服务器返回的是JSON格式,解析成对象 try { const parsedResult = JSON.parse(responseData); console.log('解析后的JSON数据:', parsedResult); } catch (parseErr) { console.log('响应不是JSON格式,直接使用原始数据即可'); } if(res.statusCode == 200){ files.forEach(function (file, index) { counter +=1}) } }); } })
方法二:用concat-stream简化流处理(需要安装依赖)
如果觉得手动监听事件麻烦,可以用concat-stream这个库帮你自动收集流数据:
- 先安装依赖:
npm install concat-stream
- 修改代码:
const concat = require('concat-stream'); form.append('location', location); form.append('name', nameList); form.submit('/', function(err, res) { console.log("upload_files") console.log("************") if (err) { return console.error('upload failed:', err); } else{ console.log('file_upload:', res.statusCode) // 用pipe把响应流导入concat-stream res.pipe(concat((data) => { // data是Buffer,转成字符串 const responseData = data.toString(); console.log('服务器返回的完整数据:', responseData); // 解析JSON(如果需要的话) try { const parsedResult = JSON.parse(responseData); console.log('解析后的JSON数据:', parsedResult); } catch (parseErr) { console.log('响应不是JSON格式'); } if(res.statusCode == 200){ files.forEach(function (file, index) { counter +=1}) } })); } })
额外提醒
如果服务器返回的是其他编码格式(比如GBK),直接用toString()可能会乱码,这时候可以用iconv-lite库来转码,安装后把data.toString()换成iconv.decode(data, 'gbk')即可。
内容的提问来源于stack exchange,提问作者ramze mosalam
相关产品推荐
相关产品推荐

