Node.js 如何订阅Angular2中的流?
我让我的流式web服务在localhost:8080/stream上运行,当任何新消息添加到订阅的mqtt流时,它都会响应。我想在Angular2应用程序中使用此web服务。我正在使用RxJS使用Angular2中的NodeJS API。我尝试了以下代码,该代码调用localhost:8080/stream一次并结束响应。我希望我的observable能够持续地监听web服务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-
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调用,并在组件中订阅服务
为了供您参考,我添加了一个我为演示目的而编写的示例
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);
});