【问题标题】:node express.js Can't set headers after they are sent.'节点 express.js 发送后无法设置标头。
【发布时间】:2017-06-22 02:13:24
【问题描述】:

我对 node 和 express 都是新手,所以我认为我在做一些愚蠢的事情。

完整的源代码可以在以下位置找到:

https://github.com/wa1gon/aclogGate/tree/master/server

logRouter.get("/loggate/v1/listall", function(req, res) {
    let countStr = req.param('count');
    let count: number;

    if (!countStr) {
        count = null;
    } else {
        count = Number.parseInt(countStr);
        if (count == NaN) count = null;
    }

    acConn.listAllDatabase(count, (err: string, result: Array<LogGateResp>) => {
        console.log("got list all data resp")
         return res.json(result).end();
    });


    }

    );
    app.use('/', logRouter);

虽然第一次有效,但第二次就崩溃了。

listallDatabase 连接到一个网络套接字,该套接字获取 XML 数据库,解析它并用 JS 对象回调。依次调用 res.json。

建议?

【问题讨论】:

  • 调用json函数后删除.end()

标签: javascript node.js express typescript


【解决方案1】:

移除 res.json() 之后的 end()。

res.josn() 将响应发送到前端,end() 尝试再次发送响应。 这就是你收到错误的原因。因为 node.js 不允许 API 发送两次响应。使用 res.end() 或 res.json()。

【讨论】:

  • 我删除了 .end() 调用,但没有帮助。
  • 问题似乎出在link 我正在从 net.socket.on 回调中调用 logRouter.get('/loggate/va/listall。如果我得到回调,它就可以工作.
  • 问题似乎出在aclogApi.ts on gethub 我正在从 net.socket.on 回调中调用 logRouter.get('/loggate/va/listall。如果我得到回调,它就可以工作. 我只是不明白。当然你可以从回调中调用回调。
  • 大部分已解决。我只使用 node http 重写了它,没有 express。有同样的问题在stackoverflow中发现了一个关于net.sockets做同样事情的问题。答案是添加一个回调到 socket.write 以调用 socket.end();
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2015-08-10
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多