#node.js #angular #server-sent-events
#node.js #angular #отправленные сервером события
Вопрос:
Я пробовал похожие вопросы / ответы, но это не помогло. Я могу установить соединение с сервером NodeJS, но не смог получить данные при публикации. Служба Angular:
import { Injectable, NgZone } from "@angular/core";
import { Observable } from "rxjs";
import { NativeEventSource, EventSourcePolyfill } from 'event-source-polyfill';
import * as ES from '../../assets/js/eventsource.min.js'
@Injectable({
providedIn: "root"
})
export class SseService {
constructor(private _zone: NgZone) {}
getServerSentEvent(url: string): Observable<any> {
return Observable.create(observer => {
const eventSource = this.getEventSource(url);
eventSource.onmessage = (event) => {console.log('sse event', event); observer.next(JSON.parse(event.data))};
});
}
private getEventSource(url: string): EventSource {
return new ES.EventSource(url,{withCredentials:true});
}
}
Угловой компонент
ngOnInit() {
this.sseService
.getServerSentEvent("https://192.168.0.100:64726/events")
.subscribe(data=> console.log("SSE" data),
error=> console.log("SSE",error))
console.log('init SSE')
}
Код сервера (узел js):
///SSE
// Middleware for GET /events endpoint
function eventsHandler(req, res, next) {
// Mandatory headers and http status to keep connection open
const headers = {
'Access-Control-Allow-Origin': 'https://192.168.0.100.xip.io:4200',
'Access-Control-Allow-Credentials':true,
'Content-Type': 'text/event-stream',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache'
};
const clientId = Date.now();
const newClient = {
id: clientId,
res
};
clients.push(newClient);
req.on('close', () => {
console.log(`${clientId} Connection closed`);
clients = clients.filter(c => c.id !== clientId);
});
res.writeHead(200, headers);
res.setTimeout(0);
res.write('n');
res.flush()
}
function sendEventsToAll(newNest) {
clients.forEach(c => {console.log("written ",c ); console.log("Data",newNest); c.res.write(JSON.stringify({data: newNest}));c.res.write('nn'); c.res.flush()})
}
async function addNest(req, res, next) {
console.log('nest add called')
const newNest = req.body;
nests.push(newNest);
// Send recently added nest as POST result
res.json(newNest)
// Invoke iterate and send function
return sendEventsToAll(newNest);
}
app.post('/nest', addNest);
app.get('/events', eventsHandler);
app.get('/status', (req, res) => res.json({clients: clients.length}));
let clients = [];
let nests = [{data:"test"}];
Я публикую данные с помощью команды CURL, я использую браузер Chrome, и когда я нажимаю на URL событий, я могу получать данные напрямую, и я сталкиваюсь с проблемой, что Angular не получает данные.
curl -X POST -H "Content-Type: application/json" -d '{"momma": "swas://192.168.0.100:64726/nest -kerature": 31}' -s
Комментарии:
1. Почему вы не используете веб-сокеты для передачи данных? Это проще, IMO.
2. попытка SSE отправить только данные с сервера, соответствует моему сценарию
3. @javapedia.net вы нашли решение для этого?