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)
阿克沙耶 M 盖卡尔

没有break;你的case. 因此,超出当前匹配的所有案例case将依次执行,直到结束。

编辑

尝试重新启动 SQL 服务器

更新

您有两个选择:在您的 sendJSON 函数中使用:

选项 1(无快递):

resp.writeHead('Content-Type', 'application/json'); resp.end(JSON.stringify(data));

或者

OPTION 2 (With Express):这里不需要指定header类型

res.json(data);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Express (node.js) using HTTPS and HTTP

来自分类Dev

Node.js结束错误后写入zlib

来自分类Dev

Node.js Web服务器中的结束后写入错误

来自分类Dev

node.js服务器句柄请求回调函数在写入响应之前结束

来自分类Dev

监视Node.js HTTP Server的命令

来自分类Dev

Node.js HTTP response streams

来自分类Dev

Node.js HTTP响应流

来自分类Dev

Node.js:http.js:691抛出新错误(“发送后无法设置标头。”)

来自分类Dev

带有node.js的http请求失败,发送后无法设置标头

来自分类Dev

Node.js HTTP服务器

来自分类Dev

在node.js应用程序中全部完成后并行的http并行获取请求

来自分类Dev

Node.js:http请求在1分钟后超时

来自分类Dev

Node.js HTTP状态代码列表

来自分类Dev

Express,csvtojson和node-walk的“结束后写入”错误

来自分类Dev

Node js写入文件

来自分类Dev

Node JS TCP代理:使用Node JS设置HTTP隧道

来自分类Dev

Node JS上的HTTP请求回调

来自分类Dev

Node.js“结束后写入”错误

来自分类Dev

Node.js:写入后关闭文件

来自分类Dev

循环结束后在Node.js中执行条件语句

来自分类Dev

Node.js axios http请求循环

来自分类Dev

使用Node JS(fs和http)保存后无法打开JPG或PNG

来自分类Dev

Node.js和MySQL:HTTP服务器在首次运行后停止

来自分类Dev

如何在node.js中结束HTTP响应主体

来自分类Dev

Node.js HTTP服务器

来自分类Dev

node.js http代理重定向

来自分类Dev

Node JS TCP代理:使用Node JS设置HTTP隧道

来自分类Dev

Node.JS Sharp库-结束后写入错误

来自分类Dev

AWS Lambda Node.js 在异步 HTTP 请求完成后执行 this.emit