Deepinder Singh

Følg
Nov 25, 2019 · 7 min læs

denne artikel er flyttet her. For seneste version af denne artikel kan du besøge linket givet.

foto af Pankaj Patel på Unsplash

dette kan være det mest frygtede spørgsmål blandt nye udviklere om, hvordan man laver en app med Angular og Socket.io.da de fleste apps bruger stikkontakter til realtidskommunikation af Frontend med Backend. Så i dag vil jeg tale om, hvordan man integrerer socket.io med en vinkel app. Denne kode fungerer for alle Vinkelversioner over Angular1.

opdateret – denne artikel er blevet opdateret i December 2020 for at håndtere den nyeste version V3 ændringer af socket.io

lad os starte med at oprette etnode projekt først.

Opret et nyt directory og indtast det derefter.

mkdir socketio-node

dette vil oprette en tom mappe med navnsocketio-node.

Vi skal bruge noden.express. Sørg for Node.JS er installeret på dit system.

lad os først oprette enpackage.json manifest-fil, der beskriver vores projekt.
Opret en fil med navnet package.JSON og indsæt nedenstående kode i den.(Du kan også gøre det mednpm init)

{
"name": "socketio-node",
"version": "0.0.1",
"description": "my first socket.io app",
"dependencies": {}
}

nu, for nemt at udfyldedependencies ejendom vi skal installereexpress, Skriv dette i terminalen.

npm install express

det vil installere og tilføje den nyeste version af ekspres i vores projekt og din dependencies vil nu se ud

"dependencies": {
"express": "^4.17.1"
}

nu hvor Ekspres er installeret, kan vi oprette en index.js fil, der vil opsætte vores ansøgning.

const app = require('express')();
const http = require('http').createServer(app);
app.get('/', (req, res) => {
res.send('<h1>Hey Socket.io</h1>');
});
http.listen(3000, () => {
console.log('listening on *:3000');
});

denne kode forklares i følgende trin:

  • Ekspres initialiserer app for at være en funktionshåndterer, som du kan levere til en HTTP-server (som det ses i linje 2).
  • Vi definerer en rutefører / der bliver kaldt, når vi rammer vores hjemmeside hjem.
  • Vi får http-serveren til at lytte på port 3000.

Hvis du kører node index.js du skal se følgende:

åbning http://localhost:3000 :

lad os Nu integrere socket.io i vores node app. For det første skal vi installere socket.io afhængighed i vores app. Kør dette i terminalen.

npm install socket.io

dette vil installere modulet og tilføje afhængigheden tilpackage.json. Lad os nu redigere index.js for at tilføje det:

const app = require('express')();
const http = require('http').createServer(app);
const io = require('socket.io')(http, {
cors: {
origins:
}
});app.get('/', (req, res) => {
res.send('<h1>Hey Socket.io</h1>');
});io.on('connection', (socket) => {
console.log('a user connected');
socket.on('disconnect', () => {
console.log('user disconnected');
});
});http.listen(3000, () => {
console.log('listening on *:3000');
});

Bemærk, at jeg initialiserer en ny forekomst afsocket.io på linje 3 ved at passerehttp (HTTP-serveren) objekt og cors-indstillingerne (opdateret til socket.io v3) for at tillade vores vinkel localhost url, kan du sætte i url ‘ en eller din frontend klient, i mit tilfælde var det localhost:4200
så lytter jeg på connection og disconnection begivenheder for indgående stikkontakter, og jeg logger det til konsollen.

vores Backend er god at gå for nu, vi kommer tilbage til vores node kode, når vi implementerer flere begivenheder videre.

lad os starte med at oprette enAngular app nu. Jeg vil oprette en ny Angular app fra bunden, mens de fleste af jer allerede ville have en oprettet med dig.
De, der allerede har en fungerendeAngular app kan springe over følgende kode:

npm install -g @angular/cli
ng new socketio-angular

dette ville installere den nyeste version afAngular CLI og oprette en ny Vinkelapp fra bunden.

lad os nu tilføje socket.io dependency i Vores vinkel app.

cd socketio-angular
npm install socket.io-client

dette ville installere det nyestesocket.io-client bibliotek i vores Vinkelapp.

lad os nu starte med at oprette en service at håndtere socket.io forbindelse. Jeg ville oprette et rodniveau singleton service navngivet socketio.service.ts og inkludere det i AppModule . Du kan oprette tjenesten i henhold til din projektstruktur.
Du kan oprette tjenesten ved at køre følgende kommando.

ng g s socketio

dette ville skabe en tjeneste ved navnsocketio.service.ts. Katalogstrukturen ville se sådan ud. Dette er bare en simpel demo på en side, så jeg tilføjede tjenesten i basismappen som denne.

gå nu ind i socketio.service.ts fil og importer følgende:

import { io } from 'socket.io-client';

lad os nu tilføje stikkontakten, som vi ville forbinde stikket til indeenvironment.ts fil.

export const environment = {
production: false,
SOCKET_ENDPOINT: 'http://localhost:3000'
};

lad os nu prøve at oprette forbindelse til vores stikkontakt og oprette en stikkontakt. Først skal vi tilføje SocketioServicei voresAppModuleog injicere tjenesten i voresapp.component.ts. Lad os først tilføje tjenesten til vores udbydere. I app.module.ts gør dette:

@NgModule({
declarations: ,imports: ,providers: ,
bootstrap: })export class AppModule { }

og lad os gå til socketio.service.ts og skrive en socket init funktion.

export class SocketioService { socket; constructor() { } setupSocketConnection() {
this.socket = io(environment.SOCKET_ENDPOINT);
}
}

dette vil erklære en variabel med navnetsocketog derefter efter at have kaldtsetupSocketConnectionmetode,socket variablen ville indeholde det tilsluttede sokkelobjekt.

lad os nu kalde denne metode fra app.component.ts inde i ngOnInit.

export class AppComponent implements OnInit { title = 'socketio-angular'; constructor(private socketService: SocketioService) {} ngOnInit() {
this.socketService.setupSocketConnection();
}
}

Hvis du bruger vinkel 6 og derover, kan du løbe ind i denne fejl.

Uncaught ReferenceError: global is not defined

dette skyldes, at version 6 af Angular CLI Angular team fjerner shim forglobal og andre node indbyggede. Hvis vi bruger et bibliotek, der antager, at disse globaler er til stede(socket.io-client i vores tilfælde), kan du prøve manuelt at shimme det inde i din polyfills.ts fil:

// Add global to window, assigning the value of window itself.
(window as any).global = window;

tilføjelse af denne linje til din polyfills.ts fil ville løse problemet, og din app ville arbejde igen. For at læse mere om ovenstående problem, Følg dette link.

Når du har kørt Vinkelappen nu, Kan du se stikket tilsluttet, og vores node-appkonsol viser a user connected som denne:

Når du afbryder stikket eller lukker hjemmesiden, kan du se user disconnected besked på konsollen.

med dette har vi afsluttet vores initialisering af stikkontakter. Nu vil vi lære om, hvordan man udsender og lytter til begivenheder.

lad os registrere en begivenhed kaldetmy message inde i voresindex.js nodefil og konsolere dataene, og vi udsender den samme begivenhed fraAngular app.

io.on('connection', (socket) => { console.log('a user connected'); socket.on('disconnect', () => { console.log('user disconnected'); }); socket.on('my message', (msg) => { console.log('message: ' + msg); });});

og lad os udsende den samme begivenhed fra Vinkelkode

setupSocketConnection() { this.socket = io(environment.SOCKET_ENDPOINT); this.socket.emit('my message', 'Hello there from Angular.');}

denne kode ville udsende begivenheden ved navnmy message og det ville udskrive følgende på vores node konsol. Du kan se beskeden ‘Hej der fra vinkel’. Vores brugerdefinerede begivenheder fungerer nu.

Nu, lad os emit en begivenhed fra server side. Vi sender begivenheden til alle tilsluttede brugere. Vi sender den samme besked, som vi modtog fra klienten, og forbereder en serverstreng til den.

io.on('connection', (socket) => {
socket.on('my message', (msg) => {
io.emit('my broadcast', `server: ${msg}`);
});
});

lad os tilføje en lytter til my broadcast begivenhed på vores Vinkelapp nu.

this.socket.on('my broadcast', (data: string) => {
console.log(data);
});

Når du har gjort dette, kan du tjekke dinbroswer console, det villeprint noget som dette. Det udskriver en besked fra server, der udsendte udsendelsen.

Vi har dækket basic dele af tilslutning af en node socket.io-app med en Kantet app.

Bonus tip: Du kan også sende query parameterstil Backend, når du tilslutter til stikket ved hjælp af options med url i en forbindelse.

this.socket = io(environment.SOCKET_ENDPOINT, {
auth: {
token: 'cde'
}
});

til fetch disse oplysninger på Backend, vi skal gøre det sådan:

io.on('connection', (socket) => {
let token = socket.handshake.auth.token;
});

dette ville returnere værdien cde bestået af frontend.

Du kan kontrollere alle ovenstående skriftlige eksempelkode på min github.

Dette afslutter min artikel om oprettelse af en real time application med Angular og Socket.io med NodeJS. Jeg har dækket basics for at forbinde apps. Der er meget mere information om stikkontakter, der kan udforskes som værelser, Online offline status, sende flere data, hente online brugere. Disse oplysninger kan ikke dækkes i en enkelt artikel. Vil writeom disse emner, hvis duliked my work på denne blog.

skriv ned dine anmeldelser.

kunne lide mit arbejde? Giv mig en kop kaffe.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.