Looking for node.js Answers? Try Ask4KnowledgeBase
Looking for node.js Keywords? Try Ask4Keywords

Node.jsKomma igång med Node.js


Anmärkningar

Node.js är ett händelsebaserat, icke-blockerande, asynkron I / O-ramverk som använder Googles V8 JavaScript-motor. Det används för att utveckla applikationer som utnyttjar förmågan att köra JavaScript både på klienten och på serversidan och därför dra nytta av kodens återanvändbarhet och bristen på kontextbyte. Det är öppen källkod och plattform. Node.js-applikationer skrivs i ren JavaScript och kan köras i Node.js-miljö i Windows, Linux osv ...

versioner

Version Utgivningsdatum
v8.2.1 2017/07/20
v8.2.0 2017/07/19
v8.1.4 2017/07/11
v8.1.3 2017/06/29
V8.1.2 2017/06/15
v8.1.1 2017/06/13
v8.1.0 2017/06/08
v8.0.0 2017/05/30
v7.10.0 2017/05/02
v7.9.0 2017/04/11
V7.8.0 2017/03/29
v7.7.4 2017/03/21
v7.7.3 2017/03/14
v7.7.2 2017/03/08
v7.7.1 2017/03/02
v7.7.0 2017/02/28
V7.6.0 2017/02/21
v7.5.0 2017/01/31
v7.4.0 2017/01/04
v7.3.0 2016/12/20
v7.2.1 2016/12/06
v7.2.0 2016/11/22
v7.1.0 2016/11/08
v7.0.0 2016/10/25
v6.11.0 2017/06/06
v6.10.3 2017/05/02
v6.10.2 2017/04/04
v6.10.1 2017/03/21
v6.10.0 2017/02/21
v6.9.5 2017/01/31
v6.9.4 2017/01/05
v6.9.3 2017/01/05
v6.9.2 2016/12/06
v6.9.1 2016/10/19
v6.9.0 2016/10/18
v6.8.1 2016/10/14
v6.8.0 2016/10/12
v6.7.0 2016/09/27
v6.6.0 2016/09/14
v6.5.0 2016/08/26
V6.4.0 2016/08/12
v6.3.1 2016/07/21
v6.3.0 2016/07/06
v6.2.2 2016/06/16
v6.2.1 2016/06/02
v6.2.0 2016/05/17
v6.1.0 2016/05/05
v6.0.0 2016/04/26
v5.12.0 2016/06/23
v5.11.1 2016/05/05
v5.11.0 2016/04/21
v5.10.1 2016/04/05
V5.10 2016/04/01
V5.9 2016/03/16
v5.8 2016/03/09
v5.7 2016/02/23
v5.6 2016/02/09
v5.5 2016/01/21
v5.4 2016/01/06
v5.3 2015/12/15
v5.2 2015/12/09
v5.1 2015/11/17
v5.0 2015/10/29
v4.4 2016/03/08
v4.3 2016/02/09
v4.2 2015/10/12
v4.1 2015/09/17
v4.0 2015/09/08
io.js v3.3 2015/09/02
io.js v3.2 2015/08/25
io.js v3.1 2015/08/19
io.js v3.0 2015/08/04
io.js v2.5 2015/07/28
io.js v2.4 2015/07/17
io.js v2.3 2015/06/13
io.js v2.2 2015/06/01
io.js v2.1 2015/05/24
io.js v2.0 2015/05/04
io.js v1.8 2015/04/21
io.js v1.7 2015/04/17
io.js v1.6 2015/03/20
io.js v1.5 2015/03/06
io.js v1.4 2015/02/27
io.js v1.3 2015/02/20
io.js v1.2 2015/02/11
io.js v1.1 2015/02/03
io.js v1.0 2015/01/14
v0.12 2016/02/09
v0.11 2013/03/28
v0.10 2013/03/11
v0.9 2012-07-20
v0.8 2012-06-22
v0.7 2012-01-17
v0.6 2011-11-04
v0.5 2011-08-26
v0.4 2011-08-26
v0.3 2011-08-26
v0.2 2011-08-26
v0.1 2011-08-26

Hej World HTTP-server

Installera först Node.js för din plattform.

I det här exemplet skapar vi en HTTP-server som lyssnar på port 1337, som skickar Hello, World! till webbläsaren. Observera att istället för att använda port 1337 kan du använda valfritt portnummer som du för närvarande inte använder någon annan tjänst.

http modulen är en Node.js- kärnmodul (en modul som ingår i Node.js källa, som inte kräver installation av ytterligare resurser). http modulen tillhandahåller funktionaliteten för att skapa en HTTP-server med hjälp av http.createServer() . Skapa en fil genom att skapa en fil som innehåller följande JavaScript-kod.

const http = require('http'); // Loads the http module

http.createServer((request, response) => {

    // 1. Tell the browser everything is OK (Status code 200), and the data is in plain text
    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    // 2. Write the announced text to the body of the page
    response.write('Hello, World!\n');

    // 3. Tell the server that all of the response headers and body have been sent
    response.end();

}).listen(1337); // 4. Tells the server what port to be on
 

Spara filen med vilket filnamn som helst. I det här fallet, om vi hello.js det hello.js vi köra applikationen genom att gå till den katalog filen finns i och använda följande kommando:

node hello.js
 

Den skapade servern kan sedan nås med webbadressen http: // localhost: 1337 eller http://127.0.0.1:1337 i webbläsaren.

En enkel webbsida visas med "Hej, världen!" text längst upp, som visas på skärmdumpen nedan.

skärmdump

Redigerbart online-exempel.

Kärnmoduler

Node.js är en Javascript-motor (Googles V8-motor för Chrome, skriven i C ++) som gör det möjligt att köra Javascript utanför webbläsaren. Medan många bibliotek finns tillgängliga för att utöka Nodes funktionaliteter, kommer motorn med en uppsättning kärnmoduler som implementerar grundläggande funktioner.

Det finns för närvarande 34 kärnmoduler i Node:

[ 'assert',
  'buffer',
  'c/c++_addons',
  'child_process',
  'cluster',
  'console',
  'crypto',
  'deprecated_apis',
  'dns',
  'domain',
  'Events',
  'fs',
  'http',
  'https',
  'module',
  'net',
  'os',
  'path',
  'punycode',
  'querystring',
  'readline',
  'repl',
  'stream',
  'string_decoder',
  'timers',
  'tls_(ssl)',
  'tracing',
  'tty',
  'dgram',
  'url',
  'util',
  'v8',
  'vm',
  'zlib' ]
 

Denna lista erhölls från Node-dokumentation API https://nodejs.org/api/all.html (JSON-fil: https://nodejs.org/api/all.json ).

Alla kärnmoduler snabbt

hävda

assert tillhandahåller en enkel uppsättning påståttest som kan användas för att testa invarianter.

buffert

Före introduktionen av TypedArray i ECMAScript 2015 (ES6) hade JavaScript-språket ingen mekanism för att läsa eller manipulera strömmar av binär data. Buffer introducerades som en del av Node.js API för att göra det möjligt att interagera med oktettströmmar i samband med saker som TCP-strömmar och filsystemoperationer.

Nu när TypedArray har lagts i ES6 de Buffer klass implementerar Uin t8Array API på ett sätt som är mer optimerat och lämpar sig för Node.js' användningsfall.

C / C ++ _ addons

Node.js-tillägg är dynamiskt länkade delade objekt, skrivna i C eller C ++, som kan laddas i Node.js med funktionen require() och användas precis som om de är en vanlig Node.js-modul. De används främst för att tillhandahålla ett gränssnitt mellan JavaScript som körs i Node.js och C / C ++ -bibliotek.

child_process

Modulen child_process ger möjlighet att leka barnprocesser på ett sätt som liknar men inte identiskt med popen (3).

klunga

En enda instans av Node.js körs i en enda tråd. För att dra fördel av flerkärniga system kommer användaren ibland att vilja starta ett kluster av Node.js-processer för att hantera belastningen. Med klustermodulen kan du enkelt skapa barnprocesser som alla delar serverportar.

trösta

Den console modulen ger en enkel felsökning konsol som liknar konsolmekanism JavaScript tillhandahålls av webbläsare.

crypto

crypto tillhandahåller kryptografisk funktionalitet som inkluderar en uppsättning omslag för OpenSSL: s hash, HMAC, chiffer, dechiffrering, signering och verifiering.

deprecated_apis

Node.js kan avskriva API: er när antingen: (a) användning av API anses vara osäker, (b) ett förbättrat alternativt API har gjorts tillgängligt, eller (c) brytande ändringar av API förväntas i en framtida större utgåva .

dns

dns modulen innehåller funktioner som hör till två olika kategorier:

  1. Funktioner som använder de underliggande operativsystemfaciliteterna för att utföra namnupplösning och som inte nödvändigtvis utför någon nätverkskommunikation. Denna kategori innehåller bara en funktion: dns.lookup() .
  2. Funktioner som ansluter till en faktisk DNS-server för att utföra namnupplösning och som alltid använder nätverket för att utföra DNS-frågor. Denna kategori innehåller alla funktioner i dns modulen utom dns.lookup() .

domän

Denna modul väntar på avskrivning . När ett ersättnings-API har slutförts kommer denna modul att avskrivas helt. De flesta slutanvändare bör inte ha anledning att använda den här modulen. Användare som absolut måste ha den funktionalitet som domänerna tillhandahåller kan förlita sig på den för närvarande men kan förvänta sig att behöva migrera till en annan lösning i framtiden.

evenemang

Mycket av Node.js kärn-API bygger kring en idiomatisk asynkron händelsestyrd arkitektur där vissa typer av objekt (kallad "emitters") regelbundet avger namngivna händelser som får funktionsobjekt ("lyssnare") att kallas.

fs

File I / O tillhandahålls av enkla omslag runt standard POSIX-funktioner. För att använda den här modulen require('fs') . Alla metoder har asynkrona och synkrona former.

http

HTTP-gränssnitten i Node.js är utformade för att stödja många funktioner i protokollet som traditionellt har varit svåra att använda. I synnerhet stora, möjligen chunk-kodade meddelanden. Gränssnittet är noga med att aldrig buffra hela förfrågningar eller svar - användaren kan strömma data.

https

HTTPS är HTTP-protokollet över TLS / SSL. I Node.js implementeras detta som en separat modul.

modul

Node.js har ett enkelt modulbelastningssystem. I Node.js finns filer och moduler i en-till-en-korrespondens (varje fil behandlas som en separat modul).

netto

net ger dig en asynkron nätverksomslag. Den innehåller funktioner för att skapa både servrar och klienter (kallas strömmar). Du kan inkludera den här modulen med require('net'); .

os

os modulen tillhandahåller ett antal operativsystemrelaterade verktygsmetoder.

väg

Den path modulen ger verktyg för att arbeta med filer och katalogvägar.

punycode

Versionen av punycode-modulen som ingår i Node.js skrivs ut .

frågesträng

Modulen querystring ger verktyg för att analysera och formatera URL-frågesträngar.

readline

readline modulen tillhandahåller ett gränssnitt för att läsa data från en läsbar ström (som process.stdin ) en rad åt gången.

repl

repl modulen tillhandahåller en Read-Eval-Print-Loop (REPL) -implementering som är tillgänglig både som ett fristående program eller som inkluderas i andra applikationer.

ström

En ström är ett abstrakt gränssnitt för att arbeta med strömningsdata i Node.js. Den stream modulen ger en bas API som gör det enkelt att bygga objekt som implementerar strömmen gränssnittet.

Det finns många strömobjekt som tillhandahålls av Node.js. Till exempel är en begäran till en HTTP-server och process.stdout båda process.stdout .

string_decoder

Modulen string_decoder tillhandahåller ett API för att avkoda Buffer till strängar på ett sätt som bevarar kodade multi-byte UTF-8 och UTF-16-tecken.

timers

timer visar ett globalt API för schemaläggningsfunktioner som ska anropas under en framtida tidsperiod. Eftersom timerfunktionerna är globala, finns det inget behov att ringa require('timers') att använda API: n.

Timerfunktionerna i Node.js implementerar ett liknande API som timerns API som tillhandahålls av webbläsare men använder en annan intern implementering som är byggd runt Node.js Event Loop .

tls_ (ssl)

Modulen tls ger en implementering av protokollet Transport Layer Security (TLS) och Secure Socket Layer (SSL) som är byggt ovanpå OpenSSL.

spårande

Trace Event tillhandahåller en mekanism för att centralisera spårningsinformation genererad av V8, Node core och userpace code.

Spårning kan aktiveras genom att passera --trace-events-enabled när du startar ett Node.js-program.

tty

tty modulen ger tty.ReadStream och tty.WriteStream . I de flesta fall kommer det inte att vara nödvändigt eller möjligt att använda den här modulen direkt.

dgram

dgram ger en implementering av UDP Datagram-uttag.

url

url modulen tillhandahåller verktyg för URL-upplösning och analysering.

util

util är främst utformad för att stödja behoven i Node.js egna interna API: er. Många av verktygen är dock användbara för applikations- och modulutvecklare också.

v8

Modulen v8 visar API: er som är specifika för den version av V8 som är inbyggd i binär Node.js.

Obs : API: erna och implementeringen kan ändras när som helst.

vm

vm modulen tillhandahåller API: er för att sammanställa och köra kod inom V8 Virtual Machine-sammanhang. JavaScript-kod kan sammanställas och köras omedelbart eller sammanställas, sparas och köras senare.

Obs! Vm-modulen är inte en säkerhetsmekanism. Använd inte den för att köra otillförlitlig kod .

zlib

zlib modulen tillhandahåller komprimeringsfunktionalitet implementerad med Gzip och Deflate / Inflate.

Felsöka ditt NodeJS-program

Du kan använda nodinspektören. Kör det här kommandot för att installera det via npm:

npm install -g node-inspector
 

Sedan kan du felsöka din ansökan med

node-debug app.js
 

Github-förvaret kan hittas här: https://github.com/node-inspector/node-inspector


Debugging natively

Du kan också felsöka node.js naturligt genom att starta det så här:

node debug your-script.js
 

För att bryta din felsökare exakt i en kodrad du vill använda:

debugger;
 

För mer information se här .

Använd följande kommando i node.js 8:

node --inspect-brk your-script.js
 

Öppna sedan about://inspect i en ny version av Google Chrome och välj ditt Node-skript för att få felsökningsupplevelsen i Chrome: s DevTools.

Distribuera din ansökan online

När du distribuerar din app till en (Node.js-specifik) PORT erbjuder den här miljön vanligtvis en PORT miljövariabel som du kan använda för att köra din server på. Ändra portnummer till process.env.PORT ger dig tillgång till applikationen.

Till exempel,

http.createServer(function(request, response) {
   // your server code
}).listen(process.env.PORT);
 

Om du vill komma åt detta offline när du felsöker kan du använda det här:

http.createServer(function(request, response) {
  // your server code
}).listen(process.env.PORT || 3000);
 

där 3000 är offline-portnumret.

Hej världs grundläggande dirigering

När du först har förstått hur du skapar en HTTP-server med nod är det viktigt att förstå hur man gör det till att "göra" saker baserat på den sökväg som en användare har navigerat till. Detta fenomen kallas "routing".

Det mest grundläggande exemplet på detta är att kontrollera if (request.url === 'some/path/here') och sedan ringa en funktion som svarar med en ny fil.

Ett exempel på detta kan ses här:

const http = require('http');

function index (request, response) {
    response.writeHead(200);
    response.end('Hello, World!');
}

http.createServer(function (request, response) {
    
    if (request.url === '/') {
        return index(request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

Om du fortsätter att definiera dina "rutter" så här, kommer du dock att sluta med en massiv återuppringningsfunktion, och vi vill inte ha en gigantisk röra så, så låt oss se om vi kan rensa detta.

Först, låt oss lagra alla våra rutter i ett objekt:

var routes = {
    '/': function index (request, response) {
        response.writeHead(200);
        response.end('Hello, World!');
    },
    '/foo': function foo (request, response) {
        response.writeHead(200);
        response.end('You are now viewing "foo"');
    }
}
 

Nu när vi har lagrat två rutter i ett objekt kan vi nu leta efter dem i vår huvuduppringning:

http.createServer(function (request, response) {
    
    if (request.url in routes) {
        return routes[request.url](request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

Nu varje gång du försöker navigera på din webbplats kommer den att kontrollera om det finns en sökväg på dina rutter och den kommer att ringa respektive funktion. Om ingen rutt hittas kommer servern att svara med en 404 (Not Found).

Och där har du det - dirigering med HTTP Server API är väldigt enkelt.

Hello World kommandorad

Node.js kan också användas för att skapa kommandoradsverktyg. Exemplet nedan läser det första argumentet från kommandoraden och skriver ut ett Hello-meddelande.

Så här kör du koden på ett Unix-system:

  1. Skapa en ny fil och klistra in koden nedan. Filnamnet är inte relevant.
  2. Gör den här filen körbar med chmod 700 FILE_NAME
  3. Kör appen med ./APP_NAME David

På Windows gör du steg 1 och kör det med node APP_NAME David

#!/usr/bin/env node

'use strict';

/*
    The command line arguments are stored in the `process.argv` array, 
    which has the following structure:
    [0] The path of the executable that started the Node.js process
    [1] The path to this application
    [2-n] the command line arguments

    Example: [ '/bin/node', '/path/to/yourscript', 'arg1', 'arg2', ... ]
    src: https://nodejs.org/api/process.html#process_process_argv
 */

// Store the first argument as username.
var username = process.argv[2];

// Check if the username hasn't been provided.
if (!username) {

    // Extract the filename
    var appName = process.argv[1].split(require('path').sep).pop();

    //  Give the user an example on how to use the app.
    console.error('Missing argument! Example: %s YOUR_NAME', appName);

    // Exit the app (success: 0, error: 1). 
    // An error will stop the execution chain. For example:
    //   ./app.js && ls       -> won't execute ls
    //   ./app.js David && ls -> will execute ls
    process.exit(1);
}

// Print the message to the console.
console.log('Hello %s!', username);
 

Hej värld i REPL

När det anropas utan argument startar Node.js en REPL (Read-Eval-Print-Loop) även känd som " Node shell ".

Skriv en node vid en kommandoprompt.

$ node
>
 

Vid noden skalprompten > typ "Hello World!"

$ node
> "Hello World!"
'Hello World!'
 

Hej värld med Express

Följande exempel använder Express för att skapa en HTTP-server som lyssnar på port 3000, som svarar med "Hej, världen!". Express är ett vanligt använt webbramverk som är användbart för att skapa HTTP API: er.

myApp en ny mapp, t.ex. myApp . Gå in i myApp och skapa en ny JavaScript-fil som innehåller följande kod (låt oss namnge det till exempel hello.js ). Installera sedan npm install --save express med npm install --save express från kommandoraden. Se den här dokumentationen för mer information om hur du installerar paket .

// Import the top-level function of express
const express = require('express');

// Creates an Express application using the top-level function
const app = express();

// Define port number as 3000
const port = 3000;

// Routes HTTP GET requests to the specified path "/" with the specified callback function
app.get('/', function(request, response) {
  response.send('Hello, World!');
});

// Make the app listen on port 3000
app.listen(port, function() {
  console.log('Server listening on http://localhost:' + port);
});
 

Kör följande kommando från kommandoraden:

node hello.js
 

Öppna din webbläsare och navigera till http://localhost:3000 eller http://127.0.0.1:3000 att se svaret.

För mer information om Express-ramverket kan du kontrollera avsnittet Web Apps With Express

Hur man startar en grundläggande HTTPS-webbserver!

När du har installerat node.js på ditt system kan du bara följa proceduren nedan för att få en grundläggande webbserver med stöd för både HTTP och HTTPS!



Steg 1: Bygg en certifikatutfärdare

  1. skapa mappen där du vill lagra ditt nyckel & certifikat:

    mkdir conf


  1. gå till den katalogen:

    cd conf


  1. ta denna ca.cnf fil för att använda som en genväg för konfigurering:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf


  1. skapa en ny certifikatutfärdare med hjälp av denna konfiguration:

    openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem


  1. nu när vi har vår certifikatutfärdare i ca-key.pem och ca-cert.pem , låt oss skapa en privat nyckel för servern:

    openssl genrsa -out key.pem 4096


  1. ta denna server.cnf fil för att använda som en genväg för konfigurering:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf


  1. generera certifikatsigneringsbegäran med denna konfiguration:

    openssl req -new -config server.cnf -key key.pem -out csr.pem


  1. underteckna begäran:

    openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem



Steg 2: Installera ditt certifikat som ett rotcertifikat

  1. kopiera ditt certifikat till mappen rotcertifikat:

    sudo cp ca-crt.pem /usr/local/share/ca-certificates/ca-crt.pem


  1. uppdatera CA-butiken:

    sudo update-ca-certificates



Steg 3: Starta din nodserver

Först vill du skapa en server.js fil som innehåller din faktiska serverkod.

Den minimala inställningen för en HTTPS-server i Node.js skulle vara något liknande:

var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);
 

Om du också vill stödja http-förfrågningar måste du göra just den här lilla modifieringen:

var http = require('http');
var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
 
  1. gå till katalogen där din server.js finns:

    cd /path/to


  1. kör server.js :

    node server.js

Installera och köra Node.js

För att börja installerar du Node.js på din utvecklingsdator.

Windows: Navigera till nedladdningssidan och ladda ner / köra installationsprogrammet.

Mac: Navigera till nedladdningssidan och ladda ner / köra installationsprogrammet. Alternativt kan du installera Node via Homebrew med hjälp av brew install node . Homebrew är en kommandoradspaketmanager för Macintosh, och mer information om det finns på Homebrews webbplats .

Linux: Följ instruktionerna för din distro på installationssidan för kommandoraden .


Kör ett nodprogram

För att köra ett Node.js-program kör du bara node app.js eller nodejs app.js , där app.js är filnamnet på din nod-källkod. Du behöver inte inkludera .js suffixet för Node för att hitta skriptet du vill köra.

Alternativt under UNIX-baserade operativsystem kan ett Node-program köras som ett terminalskript. För att göra det måste det börja med en shebang som pekar på Node-tolkaren, till exempel #!/usr/bin/env node . Filen måste också ställas in som körbar, vilket kan göras med chmod . Nu kan skriptet köras direkt från kommandoraden.

TLS Socket: server och klient

De enda stora skillnaderna mellan denna och en vanlig TCP-anslutning är den privata nyckeln och det offentliga certifikatet som du måste ange till ett alternativobjekt.

Hur man skapar en nyckel och certifikat

Det första steget i denna säkerhetsprocess är skapandet av en privat nyckel. Och vad är den här privata nyckeln? I grund och botten är det en uppsättning slumpmässigt brus som används för att kryptera information. I teorin kan du skapa en nyckel och använda den för att kryptera vad du vill. Men det är bäst att ha olika nycklar för specifika saker. För om någon stjäl din privata nyckel liknar det att låta någon stjäla dina husnycklar. Föreställ dig om du använde samma nyckel för att låsa din bil, garage, kontor etc.

openssl genrsa -out private-key.pem 1024

När vi har fått vår privata nyckel kan vi skapa en CSR (certifikatsigneringsbegäran), som är vår begäran om att få den privata nyckeln signerad av en fin myndighet. Det är därför du måste ange information relaterad till ditt företag. Denna information kommer att ses av signeringsmyndigheten och användas för att verifiera dig. I vårt fall spelar det ingen roll vad du skriver, eftersom vi i nästa steg kommer att underteckna vårt certifikat själva.

openssl req -new -key private-key.pem -out csr.pem

Nu när vi har fyllt i vårt pappersarbete är det dags att låtsas att vi är en cool signeringsmyndighet.

openssl x509 -req -in csr.pem -signkey private-key.pem -out public-cert.pem

Nu när du har den privata nyckeln och det offentliga certifikatet kan du upprätta en säker anslutning mellan två NodeJS-appar. Och som du ser i exemplskoden är det en mycket enkel process.

Viktig!

Eftersom vi själva skapade allmänheten certifikatet, i all ärlighet, är vårt certifikat värdelöst eftersom vi är nobodies. NodeJS-servern litar inte på ett sådant certifikat som standard, och det är därför vi måste säga den att faktiskt lita på vårt cert med följande alternativ avstänga godkänt: falsk. Mycket viktigt : ställ aldrig in denna variabel till sann i en produktionsmiljö.

TLS Socket Server

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem')
};

var server = tls.createServer(options, function(socket) {

    // Send a friendly message
    socket.write("I am the server sending you a message.");

    // Print the data that we received
    socket.on('data', function(data) {

        console.log('Received: %s [it is %d bytes long]',
            data.toString().replace(/(\n)/gm,""),
            data.length);

    });

    // Let us know when the transmission is over
    socket.on('end', function() {

        console.log('EOT (End Of Transmission)');

    });

});

// Start listening on a specific port and address
server.listen(PORT, HOST, function() {

    console.log("I'm listening at %s, on port %s", HOST, PORT);

});

// When an error occurs, show it.
server.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    server.destroy();

});
 

TLS Socket Client

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

// Pass the certs to the server and let it know to process even unauthorized certs.
var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem'),
    rejectUnauthorized: false
};

var client = tls.connect(PORT, HOST, options, function() {

    // Check if the authorization worked
    if (client.authorized) {
        console.log("Connection authorized by a Certificate Authority.");
    } else {
        console.log("Connection not authorized: " + client.authorizationError)
    }

    // Send a friendly message
    client.write("I am the client sending you a message.");

});

client.on("data", function(data) {

    console.log('Received: %s [it is %d bytes long]',
        data.toString().replace(/(\n)/gm,""),
        data.length);

    // Close the connection after receiving the message
    client.end();

});

client.on('close', function() {

    console.log("Connection closed");

});

// When an error ocoures, show it.
client.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    client.destroy();

});