node.js - Node.js Http 结束后写入
问题描述
我在 node.js 中编写了一个简单的 CRUD Api。在我所有的 POST、PUT 和 DELETE 函数结束后,我一直在写。我已经失去了试图解决这个问题的所有感觉,并希望有一双新的眼睛或一些关于试图追踪它的建议。GET 工作得非常好,并在 httpmgs.js 中使用相同的代码 sendJSON()。
我散布了各种各样的评论,试图找出错误发生在哪里。我不知道 req.on("end".... 是否引起了问题,所以我重写了该部分无济于事。
控制器.js:
switch (req.method){
case "GET":
if(req.url === "/staff"){
staff.getList(req, resp);
}
break;
case "POST":
if (req.url === "/staff/add"){
var reqBody = '';
req.on("data", function (data){
reqBody += data;
if(reqBody.length > 1e7){
msg.show413(req, resp);
}
});
req.on("end", function() {
console.log(req.data)
staff.add(req, resp, reqBody)
});
}
break;
case "PUT":
if (req.url === "/staff/update"){
var reqBody = '';
req.on("data", function (data){
reqBody += data;
if(reqBody.length > 1e7){
msg.show413(req, resp);
}
});
req.on("end", function() {
staff.update(req, resp, reqBody);
});
}
else{
msg.show404(req,resp);
}
break;
工作人员.js:
exports.add = function (req, resp, reqBody){
try{
if (!reqBody) throw new Error("Input not valid");
var data = JSON.parse(reqBody);
if (data){
db.executeSql("SELECT MAX(ID) AS ID FROM jarvisdb.staff",function (maxID, err){
if(err){
msg.show500(req, resp, err);
}
else{
var newID = maxID[0].ID+1
var sql = "INSERT INTO jarvisdb.staff (`ID`, `First Name`, `Last Name`) VALUES";
sql+= util.format("('%d' ,\"%s\", \"%s\")", newID, data.firstName, data.lastName);
db.executeSql(sql, (data, err)=>{
if(err){
msg.show500(req, resp, err)
}
else{
console.log('Before send')
msg.sendJSON(req,resp,data)
console.log('After send')
}
})
}
});
}
else{
throw new Error("Input not valid");
}
}
catch (ex) {
console.log('500')
msg.show500(req, resp, ex);
}
};
httpMsgs.js:
exports.sendJSON = function(req,resp,data){
if(data){
console.log('Before Write')
resp.writeHead(200, {"Content-type" : "application/json"});
console.log('Write Head')
resp.write(JSON.stringify(data));
console.log('Write body')
resp.end();
console.log('end');
}
}
预期结果:没有错误并返回 JSON
实际结果:
Listening on port 9000....
undefined
Before send
Before Write
Write Head
Write body
end
After send
events.js:174
throw er; // Unhandled 'error' event
^
Error [ERR_STREAM_WRITE_AFTER_END]: write after end
at write_ (_http_outgoing.js:572:17)
at ServerResponse.write (_http_outgoing.js:567:10)
at Object.exports.sendJSON (E:\JARVIS\API\peak-2.0\httpMsgs.js:60:14)
at db.executeSql (E:\JARVIS\API\peak-2.0\controllers\staff.js:53:33)
at Execute.conn.execute [as onResult] (E:\JARVIS\API\peak-2.0\db.js:35:9)
at process.nextTick (E:\JARVIS\API\peak-2.0\node_modules\mysql2\lib\commands\query.js:76:16)
at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
at writeAfterEndNT (_http_outgoing.js:634:7)
at process._tickCallback (internal/process/next_tick.js:63:19)
解决方案
break;
你的后面没有
case
。因此,当前匹配之外的所有案例case
将按顺序执行,直到结束。
编辑
尝试重新启动 SQL 服务器
更新
您有两个选择:在您的 sendJSON 函数中使用:
选项 1(无快递):
resp.writeHead('Content-Type', 'application/json');
resp.end(JSON.stringify(data));
或者
选项 2(使用 Express):此处无需指定标头类型
res.json(data);
推荐阅读
- python - 找到在列表中插入给定字符的所有方法
- javascript - 在 React 中创建表单时 .map() 不会正确填充选择 > 选项,但适用于普通 div
- python - 无法使用 swifter 并行化 pandas 应用
- javascript - 在回调函数Javascript中传递第二个参数
- reactjs - 需要帮助使用 react.js 将数据库中的数据添加到反应表中
- java - 从 Apache http-client 中的 HTTP 响应实体读取前 n 个字节
- python - 如何获得过程输出
- jms - 传输方案未识别:[nsp]
- angular - 反应式嵌套形式。获取错误无法读取未定义的属性“hasError”
- datatables - 使用正交数据的服务器端过滤数据表