使用Postman添加学生对象数组时遇ERR_INVALID_ARG_TYPE错误求解决
问题解决:Node.js HTTP服务器添加学生接口错误修复
错误根源分析
先澄清下:你标记的req.on("data")并不是真正的错误源,看错误栈,问题出在res.end({success: "true"})这一行:
res.end()方法只接受字符串、Buffer或Uint8Array类型的参数,你直接传了一个对象,导致类型错误。- 另外还有一个逻辑错误:当前代码会在接收请求体的异步过程完成前,就提前发送响应,导致
students.push的逻辑还没执行,响应就已经发回客户端了。
修复后的代码
function addStudent(req, res) { var body = ""; req.on("data", function (chunk) { body += chunk; }); req.on("end", function () { var post = url.parse("/?" + body, true); let name = post.query.name; let gender = post.query.gender; students.push({ name: name, gender: gender }); // 把响应逻辑移到end事件里,确保数据处理完再返回 res.writeHead(200, { "Content-Type": "application/json" }); // 将对象转为JSON字符串 return res.end(JSON.stringify({ success: "true" })); }); }
关键修改点
- 响应时机调整:把
res.writeHead和res.end移到req.on("end")回调内,确保请求体数据完全接收并处理后,再返回响应。 - 响应内容格式修正:用
JSON.stringify()把返回的对象转为JSON字符串,符合res.end()的参数要求,同时也匹配你设置的Content-Type: application/json响应头。
额外建议
如果是处理POST请求,更规范的方式是解析请求的Content-Type,比如如果是application/x-www-form-urlencoded,可以用querystring.parse(body)来解析,比用url.parse更合理:
// 记得先导入querystring模块 const querystring = require('querystring'); // 在end回调里替换成: const postData = querystring.parse(body); let name = postData.name; let gender = postData.gender;
内容的提问来源于stack exchange,提问作者Yoru
相关产品推荐
相关产品推荐

