Luo HTTP-verkkopalvelin Node.js:ssä käyttämällä Code esimerkki

⚡ Älykäs yhteenveto

Node.js rakentaa toimivan web-palvelimen muutamalla rivillä käyttäen sisäänrakennettua http-moduulia. Palvelin kuuntelee valittua porttia ja vastaa jokaiseen pyyntöön statuskoodilla ja rungolla, kun taas erillinen koodi hakee tietoja muilta sivustoilta.

  • 🖥️ Palvelimen luominen: http.createServer rekisteröi kerran saapuvaa pyyntöä kohden suoritettavan takaisinkutsun ja vastaanottaa pyyntö- ja vastausobjektit.
  • 🔢 Tila ja otsikot: writeHead lähettää statuskoodin ja Content-Type-tyypin ennen kuin mitään leipätekstiä kirjoitetaan.
  • 🔌 Portin sidonta: server.listen liittää sovelluksen porttiin, ja mikä tahansa vapaa porttinumero voidaan valita.
  • 📥 Lähtevät pyynnöt: Datan hakeminen toiselta sivustolta vaatii HTTP-asiakasohjelman, ja Node toimittaa nyt globaalin noutofunktion.
  • ⚠️ Vanhentunut asiakas: Pyyntömoduuli vanhentui helmikuussa 2020, eikä sitä tule käyttää uudessa koodissa.
  • 🛠️ Käynnistysvirheet: EADDRINUSE-virhe tarkoittaa, että valittu portti on jo toisen prosessin hallussa.

Luo HTTP-verkkopalvelin Node.js:ssä

Node.js Kehystä käytetään enimmäkseen palvelinpohjaisten sovellusten luomiseen. Sitä voidaan helposti käyttää web-palvelimien rakentamiseen, jotka tarjoavat sisältöä käyttäjille.

Useat moduulit käsittelevät palvelimeen liittyviä pyyntöjä, sisäänrakennettu http moduulipäällikkö niistä. Tarkastelemme, miten luodaan perus-web-palvelinsovellus Node.js:n avulla ja miten pyydetään tietoja toiselta sivustolta.

Solmu web-palvelimena HTTP:n avulla

Katsotaanpa esimerkkiä ensimmäisen Node.js-sovelluksen luomisesta ja suorittamisesta.

Sovellus luo yksinkertaisen palvelinmoduulin, joka kuuntelee porttia 7000. Kun pyyntö tehdään selaimen kautta kyseisen portin kautta, palvelin lähettää Hei maailma vastaus asiakkaalle.

Solmu web-palvelimena HTTP:n avulla

Code Selitys

  1. require funktio lukee JavaKäsikirjoitus tiedoston, suorittaa sen ja palauttaa exports-objektinsa. Tässä se lataa http moduuli, jotta sen toiminnallisuus on käytettävissä sovelluksessa.
  2. Palvelinsovellus luodaan yksinkertaisella funktiolla. Funktio suoritetaan joka kerta, kun pyyntö saavuttaa palvelimen.
  3. Kun pyyntö vastaanotetaan, vastaus lähetetään tilassa 200Tämä on HTTP-otsikon vakiotilakoodi onnistuneelle vastaukselle.
  4. Vastauksen runko itsessään on merkkijono Hei maailma.
  5. server.listen saa sovelluksen kuuntelemaan asiakaspyyntöjä portissa 7000. Mitä tahansa vapaata porttia voidaan käyttää.

Jos komento suoritetaan onnistuneesti, seuraava tuloste näkyy selaimessa.

ulostulo

Solmun web-palvelimen lähtö

Tulosteesta:

  • Selaaminen paikalliseen isäntään URL portissa 7000 näyttää merkkijonon Hei maailma sivulla.
  • Koska koodi määrittää portin 7000, tuloste näkyy vain, kun selataan kyseiseen porttiin.

Tässä on koodi viitteeksi:

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

GET-pyyntöjen käsittely Node.js:ssä

GET-pyynnön tekeminen datan hakemiseksi toiselta sivustolta on yksinkertaista Node.js:ssä. Historiallisesti tämä on vaatinut request moduuli, asennettuna komentoriviltä:

npm install request

Komento pyytää Node-paketinhallintaa lataamaan tarvittavan moduulin ja asentamaan sen. Kun asennus onnistuu, komentorivi näyttää asennetun moduulin nimen ja version muodossa <name>@<version>.

npm-asennuspyynnön tuloste

Yllä olevassa kuvakaappauksessa request moduuli ja sen versionumero ladattiin ja asennettiin.

GET-pyynnön tekeminen Node.js:ssä

Code Selitys

  1. request Edellisessä vaiheessa asennettu moduuli tarjoaa funktiot, joita tarvitaan GET-pyyntöjen tekemiseen verkkosivustoille.
  2. Sivustolle tehdään GET-pyyntö, ja vastauksen saapuessa suoritetaan takaisinsoitto. Takaisinsoitto vastaanottaa kolme parametria:
    1. Virhe — kirjaa kaikki pyyntöä tehtäessä ilmenneet virheet.
    2. Vastaus — sisältää vastauksen mukana palautetut HTTP-otsikot.
    3. elin — sisältää vastauksen koko sisällön.
  3. Sisältö, joka vastaanotettiin body Parametri kirjoitetaan konsoliin.

Tässä on koodi viitteeksi:

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

⚠️ Vanhenemisilmoitus: Ishayoiden opettaman request moduuli oli kokonaan vanhentunut helmikuussa 2020 eikä vastaanota enää päivityksiä. Se asentuu ja toimii edelleen, joten yllä oleva esimerkki on edelleen voimassa olemassa oleville projekteille, mutta npm install request tulostaa nyt vanhentumisvaroituksen. Uuden koodin tulisi käyttää sisäänrakennettua fetch seuraavassa osiossa esitetty funktio.

HTTP-pyyntöjen tekeminen Native fetchillä Node.js:ssä

Solmu on sisällyttänyt globaalin fetch funktio versiosta 18 lähtien, vastaten selainten jo tarjoamaa API-rajapintaa. Pakettien asentamista ei vaadita, ja funktio palauttaa lupauksen, joten se toimii suoraan async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 — check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

Kolme eroa takaisinsoittotyyliin verrattuna on syytä huomata. Ensinnäkin, fetch hylkää vain verkkotason virheen sattuessa; HTTP 404- tai 500-virhe ratkaisee silti onnistuneesti, minkä vuoksi response.ok tarkistus on olemassa ja miksi sen poisjättäminen on yleisin virhe siirryttäessä requestToiseksi, leipätekstiä ei toimiteta vastauksen mukana – se on luettava eksplisiittisesti response.text() pelkkää tekstiä varten tai response.json() JSON-kutsulle, ja jokainen niistä palauttaa oman lupauksensa. Kolmanneksi, koska koko kutsu on lupauspohjainen, yksittäinen try/catch kattaa sekä pyynnön että rungon lukemisen ja korvaa error-first-kutsuparametrin kokonaan.

Skripteille, joiden on toimittava Node 16:ssa tai vanhemmassa, asenna node-fetch or axios sen sijaan, koska molemmat tarjoavat vertailukelpoisen promise-pohjaisen rajapinnan ja vaativat vain muutoksen tuontiriviin, kun ajonaikainen ympäristö on päivitetty.

request vs. fetch vs. axios: kumpaa käyttää

Useimmissa Node-materiaaleissa esiintyy kolme HTTP-asiakasohjelmaa, ja vain yksi niistä on järkevä oletusarvo uusille töille. Ne eroavat toisistaan ​​ylläpitotilan, riippuvuuden tarpeen ja virhetilan signaalin suhteen, joten alla olevassa taulukossa ne on esitetty rinnakkain.

Aspect pyyntö nouto (sisäänrakennettu) Axios
Tila Vanhentunut vuodesta 2020 lähtien Ylläpidetään ytimessä Aktiivisesti huollettu
Asennus npm-paketti Ei mitään solmussa 18+ npm-paketti
Tyyli Virhe ensin -takaisinkutsu Lupaus Lupaus
JSON-jäsennys Manuaalinen tai JSON-vaihtoehto Manuaalinen response.json()-funktion kautta automaattisesti
Hylkää 404- tai 500-koodilla Ei Ei Kyllä

Käyttää fetch uusille projekteille nykyisessä Node-versiossa, koska se ei lisää riippuvuuksia ja vastaa selaimen API-rajapintaa, jonka kehittäjät jo tuntevat. Valitse axios kun automaattinen JSON-käsittely, pyyntöjen sieppaajat tai virhetilojen hylkääminen tallentaisivat oikeaa koodia. Pidä request vain vanhoissa sovelluksissa, jotka ovat jo siitä riippuvaisia ​​ja suunnittelevat sen korvaamista.

Yleisiä Node.js-palvelinvirheitä ja niiden korjaaminen

Useimmat ensimmäisen solmupalvelimen käynnistyksen epäonnistumiset johtuvat porteista, poluista tai puuttuvasta vastauksesta pikemminkin kuin itse palvelinkoodista.

  • LISÄVARUSTEET: toinen prosessi pitää jo porttia hallussaan. Suorita netstat -ano | findstr :7000 on Windowstai lsof -i :7000 on macOS ja Linux, pysäytä sitten prosessi tai valitse toinen portti.
  • EACCES matalalla portilla: Alle 1024 olevat portit tarvitsevat laajennetut käyttöoikeudet. Käytä kehityksen aikana yli 1024-porttia, kuten 3000 tai 7000.
  • Selain jumiutuu eikä lataudu koskaan: käsittelijä ei koskaan soittanut response.end()Yhteys pysyy auki, kunnes se aikakatkaistaan, joten jokaisen käsittelijän läpi kulkevan polun on päätettävä vastaus.
  • Moduulia 'http' ei löydy: Tiedostonimi on kirjoitettu väärin tai skripti suoritetaan selaimessa Noden sijaan. Ydinmoduuleja ei tarvitse asentaa.
  • Muutokset eivät näy: Solmu lataa tiedoston kerran käynnistyksen yhteydessä. Käynnistä prosessi uudelleen jokaisen muokkauksen jälkeen tai suorita se tarkkailijan, kuten node --watch server.js.

UKK

Http-moduuli riittää yhdelle päätepisteelle. Express lisää reitityksen, väliohjelmiston ja rungon jäsentämisen, joista tulee riippuvuuden arvoisia, kun sovellus palvelee useita reittejä.

Vaaditaan https moduulin sijaan ja välittää avaimen ja varmenteen createServer-palvelimelle. Tuotannossa käänteinen välityspalvelin, kuten Nginx, yleensä lopettaa TLS:n ja välittää pelkän HTTP:n Nodelle.

Kyllä. AI työkalut muuntavat virheestä johtuvia takaisinkutsuja luotettavasti asynkroniseksi odotusmuotoon. Tarkista, että luotu koodi lisää response.ok-testin, koska fetch ratkaisee 404-virheen ja tämä tarkistus usein jätetään pois.

Tekoälyavustajat lukevat virhekoodin ja nimeävät syyn suoraan erottaen porttiristiriidan käyttöoikeusongelmasta tai syntaksivirheestä, mikä lyhentää huomattavasti arvailua ensimmäisessä Node-projektissa.

Pyyntöobjekti on virta, joten kerää sen datatapahtumat puskuriin ja jäsennä tulos tapahtuman päättyessä. Express ja vastaavat kehykset tarjoavat rungon jäsentämiseen tarkoitetun väliohjelmiston, joka suorittaa tämän vaiheen puolestasi.

Tiivistä tämä viesti seuraavasti: