Node.js 如何订阅Angular2中的流?

Node.js 如何订阅Angular2中的流?,node.js,angular,rxjs,observable,Node.js,Angular,Rxjs,Observable,我让我的流式web服务在localhost:8080/stream上运行,当任何新消息添加到订阅的mqtt流时,它都会响应。我想在Angular2应用程序中使用此web服务。我正在使用RxJS使用Angular2中的NodeJS API。我尝试了以下代码,该代码调用localhost:8080/stream一次并结束响应。我希望我的observable能够持续地监听web服务 var headers = new Headers(); headers.append('Access-Control-

我让我的流式web服务在localhost:8080/stream上运行,当任何新消息添加到订阅的mqtt流时,它都会响应。我想在Angular2应用程序中使用此web服务。我正在使用RxJS使用Angular2中的NodeJS API。我尝试了以下代码,该代码调用localhost:8080/stream一次并结束响应。我希望我的observable能够持续地监听web服务

var headers = new Headers();
headers.append('Access-Control-Allow-Origin', '*');
headers.append('Content-Type', 'application/json');

let options = new RequestOptions({ headers: headers }); // Create a request option
 return this.http.get("http://localhost:8080/stream", options) // ...using post request
   .map((res: Response) => res.json()) // ...and calling .json() on the response to return data
   .catch((error: any) => Observable.throw(error.json().error));

若我理解你们的问题是正确的,那个么你们需要使用流中的数据,其中新消息在某个时间段到达

要实现这一点,您需要添加订阅服务

return this.http.get("http://localhost:8080/stream", options) // ...using post request
   .map((res: Response) => res.json()) // ...and calling .json() on the response to return data
   .catch((error: any) => Observable.throw(error.json().error)
   .subscribe(result => this.result =result));
结果将随着新数据的到来而更新,您可以按照自己的方式使用它

注意:最佳做法是在服务中分离http调用,并在组件中订阅服务

为了供您参考,我添加了一个我为演示目的而编写的示例

  • 为http调用创建服务
  • @可注射() 导出类JSONPlaceholder服务{

        constructor(private http:Http){}
    
        getAllPosts():Observable<Post[]>{
    
            return this.http.get("https://jsonplaceholder.typicode.com/posts")
            .map(res=>res.json())
    
    
        }       
    
    }


    使用socket.io将数据从NodeJ流式传输到angular

    当我尝试这样做的时候,这是一件非常有用的事情。下面包含源于原作者的代码。这是从一个有效的解决方案,可能需要一些调整

    服务器端

    var app     = express(),
        http    = require('http'),
        ioServer    = require('socket.io');
    
    var httpServer = http.createServer(app);
    var io = new ioServer();
    httpServer.listen(1337, function(){
      console.log('httpServer listening on port 1337');
    });
    
    io.attach(httpServer);
    
    io.on('connection', function (socket){
        console.log(Connected socket ' + socket.id);
    });
    
    
    //MQTT subscription
    client.on('connect', function () { 
        client.subscribe(topic, function () { 
            console.log("subscribed to " + topic) 
            client.on('message', function (topic, msg, pkt) { 
    
                io.sockets.emit("message", {topic: topic, msg: msg, pkt: pkt});
    
            }); 
        }); 
    });
    
    客户端

    var app     = express(),
        http    = require('http'),
        ioServer    = require('socket.io');
    
    var httpServer = http.createServer(app);
    var io = new ioServer();
    httpServer.listen(1337, function(){
      console.log('httpServer listening on port 1337');
    });
    
    io.attach(httpServer);
    
    io.on('connection', function (socket){
        console.log(Connected socket ' + socket.id);
    });
    
    
    //MQTT subscription
    client.on('connect', function () { 
        client.subscribe(topic, function () { 
            console.log("subscribed to " + topic) 
            client.on('message', function (topic, msg, pkt) { 
    
                io.sockets.emit("message", {topic: topic, msg: msg, pkt: pkt});
    
            }); 
        }); 
    });
    
    创建一个
    customService
    ,其中包含以下内容

    import * as io from 'socket.io-client';
    
    申报

    private ioSocket: any;
    private subscribersCounter = 0;
    
    内部服务类

    constructor() {
    
        this.ioSocket = io('socketUrl', {});
    
    }
    
    on(eventName: string, callback: Function) {
        this.ioSocket.on(eventName, callback);
    }
    
    removeListener(eventName: string, callback?: Function) {
        return this.ioSocket.removeListener.apply(this.ioSocket, arguments);
    }
    
    fromEvent<T>(eventName: string): Observable<T> {
        this.subscribersCounter++;
        return Observable.create((observer: any) => {
            this.ioSocket.on(eventName, (data: T) => {
                observer.next(data);
            });
            return () => {
                if (this.subscribersCounter === 1) {
                    this.ioSocket.removeListener(eventName);
                }
            };
        }).share();
    }
    

    您应该在angular上使用websocket,让它监听您的服务URL,然后您应该监听它的事件(打开、关闭、消息),然后使用Rxjs创建您自己的主题流,将新数据推送到订阅者

    请检查以下URL:


    @VolodymyrBilyachat如果我遗漏了什么,欢迎您提出建议:)“我希望我的observable持续收听web服务。”所以OP想要订阅长池或websocketit不是在websocket上运行,它只是在http服务器上运行。订阅observable不是这样做的吗?持续监听api或服务?@shaN当您使用promise时,它会给您一个响应,但当使用Observable和subscribe时,您会在流中得到响应。您在节点上使用mqtt包吗?是的,我在节点@shaN上使用mqtt.js包。这可能是它的副本。client=mqtt.connect()//您在此处添加了一个ws://url,--但我只有http url。两者都是相同的:)我可以使用我在NodeJSY中使用的mqtt模块吗?您必须从“mqtt”导入顶部的
    import{*}url将是mqtt代理的名称?在angular2中订阅mqtt的主题?我已经尝试过了,但它对我不起作用,因为它需要ws-url,而我有http-url。
    
    service.on("message", dat => {
     console.log(dat);
    });