【发布时间】:2016-04-18 21:22:34
【问题描述】:
我已阅读有关此错误的其他问题,但我看不出任何答案如何适用于我自己的案例。我已经检查了通常的罪魁祸首——在调用 send 后我没有对响应对象做任何事情,据我所知,我的回调不会被多次调用。但无论我尝试什么,我都会收到错误“发送后无法设置标题”。这是我的代码示例:
var express = require('express');
var ws = require('nodejs-websocket');
var app = express();
var socket = ws.connect("ws://localhost:5000");
var port = 8000;
app.get('/', function(req, res) {
var r = JSON.stringify({
type: "page request",
request: {
url: req.query.url,
app: req.query.app
}
});
socket.on("text", function(str){
console.log(str);
var d = JSON.parse(str);
res.send(d.response.body);
return;
});
socket.sendText(r);
});
app.listen(port, function(){
console.log("Node app is running on port", port);
});
对“/”的第一个请求就像一个魅力(或者看起来如此)。但是,每次第二个请求都会导致“发送后无法设置标头”。也许我不明白 websocket 的回调是如何围绕 res 对象关闭的?它是否一直在引用原始 res 对象?我原以为每次请求路由时都会使用新的 res 对象重新定义回调,但也许我错了?
这里还有其他问题。例如,如果没有从 websocket 收到响应,那么响应将永远不会被返回,这是我计划解决的问题。此外,代码现在的方式通过 websocket 传递的任何第二条消息都可能导致错误,但我目前正在我的本地机器上仅使用一个连接的客户端进行测试,并且我正在将所有消息打印到控制台并且可以看到在请求/响应生命周期中只有一条消息通过。非常感谢任何帮助!
【问题讨论】:
-
您是否搜索过此特定错误?这里可能有 100 个与该特定错误相关的类似问题,并且根本原因始终相同。从代码的外观来看,您还需要了解 异步 响应。您的代码不会从上到下执行。异步回调在很久以后才被调用。
-
而且,您不希望在
app.get()处理程序中执行socket.on()。每次命中路由时都会添加一个新的事件处理程序。这段代码有很多问题。我们真的无法帮助重新设计它,因为您没有描述所需的行为。 -
@jfriend00 - 那么这就回答了这个问题 - 所以调用 socket.on("text"... 定义了第二个处理程序?它不会覆盖第一个处理程序?这显然可以解释它。而且我知道代码不会从上到下执行,我不希望它这样做。
-
您还存在并发问题,因为如果多个请求到达您的服务器到
/路由,您无法分清哪个socket.on('text')响应属于哪个传入的 http 请求,他们可以轻松混在一起。设计需要一些工作。