Node.js NodeJS:如何使用订阅的websocket的多个响应更新视图?

Node.js NodeJS:如何使用订阅的websocket的多个响应更新视图?,node.js,websocket,meanjs,Node.js,Websocket,Meanjs,我不熟悉WebSocket 我试图在MeanJS应用程序中实现一个websocket来订阅另一个网站提供的一些实时数据,当返回数据时,我想用结果更新视图中的一个表 我遇到了一个合乎逻辑的问题。我的实现失败,因为它正试图通过一个tcp连接发送多个响应。我相信,它会因以下错误而死亡: throw new Error('Cant set headers after they are sent.'); 我理解为什么会发生这个错误,但由于WebSocket和NodeJS都是新手,我不知道如何以合理的方式

我不熟悉WebSocket

我试图在MeanJS应用程序中实现一个websocket来订阅另一个网站提供的一些实时数据,当返回数据时,我想用结果更新视图中的一个表

我遇到了一个合乎逻辑的问题。我的实现失败,因为它正试图通过一个tcp连接发送多个响应。我相信,它会因以下错误而死亡:

throw new Error('Cant set headers after they are sent.');
我理解为什么会发生这个错误,但由于WebSocket和NodeJS都是新手,我不知道如何以合理的方式重构代码

在我的客户端控制器中:

在我的服务器端控制器中:


重构此代码的最佳方法是什么,这样我就可以订阅websocket,从中接收消息,并在收到任何消息时使用数据更新视图?

在每个新传入的http请求中,您都试图向某个站点打开一个新的websocket,然后每次收到消息时,您都试图发送响应。同时,您永远不会关闭websocket

当您尝试在第一个响应已经发送的情况下向同一http请求发送第二个http响应时,会发生特定的错误。当您在websocket上收到第二条消息时,这将发生在您的代码中

此外,每次收到此请求时,您都会打开一个新的websocket,这只会使这些打开的websocket累积

如果您确实必须使用websocket来获取数据,那么您需要在收到第一条消息后立即关闭websocket,或者删除这些与特定请求关联的事件处理程序

这里有一种方法:

exports.getOrderbook = function(req, res, next) {
    var exchange = req.exchange;

    if(exchange.slug === 'somesite') {
        var ws = new WebSocket('wss://www.somesite.com/realtimews');

        ws.on('open', function open() {
            ws.send('{"op": "subscribe", "args": "orderBook"}');
        });

        ws.on('message', function(message) {
            var response = JSON.parse(message);

            if(response.table) {
                res.jsonp(response.data);
            } else {
                res.jsonp(/* some error response here */)
            }
            // close the websocket so we don't associate any more responses
            // with this particular http request
            ws.close();                
        });
    } else {
        // need to send some response here
    }
};

谢谢我知道错误发生的原因,但我错过了ws.close。如果我要以这种方式实现它,在返回响应后关闭websocket,那么我必须不断发送HTTP请求来调用服务器端函数,以便在初始响应后获取更新。这种情况违背了订阅websocket以获取数据而不是执行长轮询的目的,我正试图这样做avoid@DaveRich-如果需要,可以创建webSocket并全局存储套接字引用。但为了将该信息返回到客户端,您需要与客户端的持久连接,例如客户端和服务器之间的websocket。您没有真正解释您试图解决的问题的总体背景和体系结构,因此我不确定该推荐什么。也许你真正应该做的是让每个客户端直接用websocket连接到orderBook服务器,这样它就可以从那里获取实时信息?@DaveRich-或者,你可以从服务器上用一个websocket连接到实时源,让每个客户端用websocket连接到你的服务器。然后,只要您在服务器上收到实时信息,您就可以立即将适当的数据转发给任何连接的客户端。谢谢,我将尝试从客户端控制器实现这一点,并了解其工作原理。
    exports.getOrderbook = function(req, res, next) {
        var exchange = req.exchange;

        if(exchange.slug === 'somesite') {
            var ws = new WebSocket('wss://www.somesite.com/realtimews');

            ws.on('open', function open() {
                ws.send('{"op": "subscribe", "args": "orderBook"}');
            });

            ws.on('message', function(message) {
                var response = JSON.parse(message);

                if(response.table) {
                    res.jsonp(response.data);
                }
            });
        }
    };
exports.getOrderbook = function(req, res, next) {
    var exchange = req.exchange;

    if(exchange.slug === 'somesite') {
        var ws = new WebSocket('wss://www.somesite.com/realtimews');

        ws.on('open', function open() {
            ws.send('{"op": "subscribe", "args": "orderBook"}');
        });

        ws.on('message', function(message) {
            var response = JSON.parse(message);

            if(response.table) {
                res.jsonp(response.data);
            } else {
                res.jsonp(/* some error response here */)
            }
            // close the websocket so we don't associate any more responses
            // with this particular http request
            ws.close();                
        });
    } else {
        // need to send some response here
    }
};