Node.js - szybki przewodnik

Co to jest Node.js?

Node.js to platforma serwerowa oparta na silniku JavaScript przeglądarki Google Chrome (silnik V8). Node.js został opracowany przez Ryana Dahla w 2009 roku, a jego najnowsza wersja to v0.10.36. Definicja Node.js zawarta w oficjalnej dokumentacji jest następująca:

Node.js to platforma oparta na środowisku wykonawczym JavaScript przeglądarki Chrome, która umożliwia łatwe tworzenie szybkich i skalowalnych aplikacji sieciowych. Node.js wykorzystuje oparty na zdarzeniach, nieblokujący model we / wy, dzięki czemu jest lekki i wydajny, idealny do aplikacji czasu rzeczywistego wymagających dużej ilości danych, które działają na rozproszonych urządzeniach.

Node.js to otwarte, wieloplatformowe środowisko wykonawcze do tworzenia aplikacji po stronie serwera i aplikacji sieciowych. Aplikacje Node.js są napisane w JavaScript i można je uruchamiać w środowisku wykonawczym Node.js w systemach OS X, Microsoft Windows i Linux.

Node.js zapewnia również bogatą bibliotekę różnych modułów JavaScript, co znacznie upraszcza tworzenie aplikacji internetowych przy użyciu Node.js.

Node.js = Runtime Environment + JavaScript Library

Funkcje Node.js.

Oto niektóre z ważnych funkcji, które sprawiają, że Node.js jest pierwszym wyborem architektów oprogramowania.

  • Asynchronous and Event Driven- Wszystkie interfejsy API biblioteki Node.js są asynchroniczne, to znaczy nieblokujące. Zasadniczo oznacza to, że serwer oparty na Node.js nigdy nie czeka na zwrócenie danych przez API. Serwer przechodzi do następnego API po jego wywołaniu, a mechanizm powiadamiania o zdarzeniach Node.js pomaga serwerowi uzyskać odpowiedź z poprzedniego wywołania API.

  • Very Fast - Biblioteka Node.js, oparta na silniku JavaScript V8 przeglądarki Google Chrome, jest bardzo szybka w wykonywaniu kodu.

  • Single Threaded but Highly Scalable- Node.js używa modelu jednowątkowego z zapętleniem zdarzeń. Mechanizm zdarzeń pomaga serwerowi odpowiadać w sposób nieblokujący i sprawia, że ​​serwer jest wysoce skalowalny w przeciwieństwie do tradycyjnych serwerów, które tworzą ograniczone wątki do obsługi żądań. Node.js używa programu jednowątkowego i ten sam program może obsługiwać znacznie większą liczbę żądań niż tradycyjne serwery, takie jak Apache HTTP Server.

  • No Buffering- Aplikacje Node.js nigdy nie buforują żadnych danych. Te aplikacje po prostu wyświetlają dane w kawałkach.

  • License- Node.js jest udostępniany na licencji MIT .

Kto używa Node.js?

Poniżej znajduje się link na wiki github zawierający wyczerpującą listę projektów, aplikacji i firm, które używają Node.js. Ta lista obejmuje między innymi eBay, General Electric, GoDaddy, Microsoft, PayPal, Uber, Wikipins, Yahoo! I Yammer.

  • Projekty, aplikacje i firmy korzystające z Node

Koncepcje

Poniższy diagram przedstawia kilka ważnych części Node.js, które omówimy szczegółowo w kolejnych rozdziałach.

Gdzie używać Node.js?

Poniżej znajdują się obszary, w których Node.js sprawdza się jako doskonały partner technologiczny.

  • Aplikacje powiązane z we / wy
  • Aplikacje do strumieniowego przesyłania danych
  • Aplikacje o dużej intensywności danych w czasie rzeczywistym (DIRT)
  • Aplikacje oparte na JSON API
  • Aplikacje jednostronicowe

Gdzie nie używać Node.js?

Nie zaleca się używania Node.js do aplikacji intensywnie wykorzystujących procesor.

Wypróbuj opcję online

Naprawdę nie musisz konfigurować własnego środowiska, aby rozpocząć naukę Node.js. Powód jest bardzo prosty, mamy już skonfigurowane środowisko Node.js online, abyś mógł wykonać wszystkie dostępne przykłady online i uczyć się poprzez praktykę. Zapraszam do modyfikowania dowolnego przykładu i sprawdzania wyników za pomocą różnych opcji.

Wypróbuj poniższy przykład przy użyciu Live Demo opcja dostępna w prawym górnym rogu poniższego przykładowego pola kodu (na naszej stronie internetowej) -

/* Hello World! program in Node.js */
console.log("Hello World!");

W przypadku większości przykładów podanych w tym samouczku znajdziesz opcję Wypróbuj, więc po prostu z niej skorzystaj i ciesz się nauką.

Konfiguracja środowiska lokalnego

Jeśli nadal chcesz skonfigurować środowisko dla Node.js, potrzebujesz następujących dwóch programów dostępnych na komputerze: (a) Edytor tekstu i (b) binarne instalacje Node.js.

Edytor tekstu

Będzie to użyte do wpisania twojego programu. Przykłady kilku edytorów obejmują Notatnik Windows, polecenie edycji systemu operacyjnego, Brief, Epsilon, EMACS i vim lub vi.

Nazwa i wersja edytora tekstu mogą się różnić w różnych systemach operacyjnych. Na przykład Notatnik będzie używany w systemie Windows, a vim lub vi może być używany w systemie Windows, a także w systemie Linux lub UNIX.

Pliki utworzone za pomocą edytora nazywane są plikami źródłowymi i zawierają kod źródłowy programu. Pliki źródłowe programów Node.js mają zazwyczaj rozszerzenie „.js”.

Przed rozpoczęciem programowania upewnij się, że masz jeden edytor tekstu i masz wystarczające doświadczenie, aby napisać program komputerowy, zapisać go w pliku, a na koniec wykonać.

Środowisko wykonawcze Node.js.

Kod źródłowy zapisany w pliku źródłowym to po prostu javascript. Interpreter Node.js będzie używany do interpretowania i wykonywania kodu javascript.

Dystrybucja Node.js jest dostępna jako binarna instalacja dla systemów operacyjnych SunOS, Linux, Mac OS X i Windows z 32-bitową (386) i 64-bitową (amd64) architekturą procesora x86.

Poniższa sekcja zawiera instrukcje instalacji dystrybucji binarnej Node.js w różnych systemach operacyjnych.

Pobierz archiwum Node.js.

Pobierz najnowszą wersję instalowalnego pliku archiwum Node.js z witryny Node.js Downloads . W chwili pisania tego samouczka następujące wersje są dostępne w różnych systemach operacyjnych.

OS Nazwa archiwum
Windows node-v6.3.1-x64.msi
Linux node-v6.3.1-linux-x86.tar.gz
Prochowiec node-v6.3.1-darwin-x86.tar.gz
SunOS node-v6.3.1-sunos-x86.tar.gz

Instalacja w systemie UNIX / Linux / Mac OS X i SunOS

W oparciu o architekturę systemu operacyjnego pobierz i rozpakuj archiwum node-v6.3.1-osname.tar.gz do / tmp, a następnie przenieś wyodrębnione pliki do katalogu / usr / local / nodejs. Na przykład:

$ cd /tmp $ wget http://nodejs.org/dist/v6.3.1/node-v6.3.1-linux-x64.tar.gz
$ tar xvfz node-v6.3.1-linux-x64.tar.gz $ mkdir -p /usr/local/nodejs
$ mv node-v6.3.1-linux-x64/* /usr/local/nodejs

Dodaj / usr / local / nodejs / bin do zmiennej środowiskowej PATH.

OS Wynik
Linux export PATH = $ PATH: / usr / local / nodejs / bin
Prochowiec export PATH = $ PATH: / usr / local / nodejs / bin
FreeBSD export PATH = $ PATH: / usr / local / nodejs / bin

Instalacja w systemie Windows

Użyj pliku MSI i postępuj zgodnie z wyświetlanymi instrukcjami, aby zainstalować Node.js. Domyślnie instalator używa dystrybucji Node.js w C: \ Program Files \ nodejs. Instalator powinien ustawić katalog C: \ Program Files \ nodejs \ bin w zmiennej środowiskowej PATH okna. Uruchom ponownie wszystkie otwarte monity poleceń, aby zmiana zaczęła obowiązywać.

Weryfikacja instalacji: wykonywanie pliku

Utwórz plik js o nazwie main.js na twoim komputerze (Windows lub Linux) z następującym kodem.

/* Hello, World! program in node.js */
console.log("Hello, World!")

Teraz uruchom plik main.js za pomocą interpretera Node.js, aby zobaczyć wynik -

$ node main.js

Jeśli wszystko jest w porządku z twoją instalacją, powinno to dać następujący wynik -

Hello, World!

Przed utworzeniem rzeczywistego „Hello, World!” aplikacji korzystającej z Node.js, zobaczmy składniki aplikacji Node.js. Aplikacja Node.js składa się z następujących trzech ważnych komponentów -

  • Import required modules - Używamy require dyrektywy, aby załadować moduły Node.js.

  • Create server - Serwer, który będzie nasłuchiwał żądań klienta, podobnie jak serwer Apache HTTP.

  • Read request and return response - Serwer utworzony we wcześniejszym kroku odczyta żądanie HTTP wysłane przez klienta, którym może być przeglądarka lub konsola i zwróci odpowiedź.

Tworzenie aplikacji Node.js.

Krok 1 - Importuj wymagany moduł

Używamy require dyrektywy, aby załadować moduł http i zapisać zwróconą instancję HTTP w zmiennej http w następujący sposób -

var http = require("http");

Krok 2 - Utwórz serwer

Korzystamy z utworzonej instancji http i wywołujemy http.createServer() w celu utworzenia instancji serwera, a następnie łączymy ją z portem 8081 przy użyciu listenmetoda skojarzona z instancją serwera. Przekaż mu funkcję z parametrami żądanie i odpowiedź. Napisz przykładową implementację, aby zawsze zwracała „Hello World”.

http.createServer(function (request, response) {
   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});
   
   // Send the response body as "Hello World"
   response.end('Hello World\n');
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

Powyższy kod wystarczy, aby stworzyć serwer HTTP, który nasłuchuje, czyli czeka na żądanie na porcie 8081 na lokalnej maszynie.

Krok 3 - Testowanie żądania i odpowiedzi

Umieśćmy razem kroki 1 i 2 w pliku o nazwie main.js i uruchom nasz serwer HTTP, jak pokazano poniżej -

var http = require("http");

http.createServer(function (request, response) {
   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});
   
   // Send the response body as "Hello World"
   response.end('Hello World\n');
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

Teraz uruchom plik main.js, aby uruchomić serwer w następujący sposób -

$ node main.js

Sprawdź dane wyjściowe. Serwer został uruchomiony.

Server running at http://127.0.0.1:8081/

Wyślij żądanie do serwera Node.js.

Otwórz http://127.0.0.1:8081/ w dowolnej przeglądarce i obserwuj następujący wynik.

Gratulacje, masz uruchomiony i pierwszy serwer HTTP, który odpowiada na wszystkie żądania HTTP na porcie 8081.

REPL oznacza Read Eval Print Loop i reprezentuje środowisko komputerowe, takie jak konsola Windows lub powłoka Unix / Linux, w którym wprowadza się polecenie, a system odpowiada, wyświetlając dane wyjściowe w trybie interaktywnym. Node.js lubNodejest dostarczany w pakiecie ze środowiskiem REPL. Wykonuje następujące zadania -

  • Read - Odczytuje dane wejściowe użytkownika, analizuje je w strukturze danych JavaScript i przechowuje w pamięci.

  • Eval - Pobiera i ocenia strukturę danych.

  • Print - Drukuje wynik.

  • Loop - Powtarza powyższe polecenie, dopóki użytkownik nie naciśnie ctrl-c dwa razy.

Funkcja REPL w Node jest bardzo przydatna w eksperymentowaniu z kodami Node.js i debugowaniu kodów JavaScript.

Terminal REPL online

Aby uprościć naukę, stworzyliśmy łatwe w użyciu środowisko REPL Node.js online, w którym możesz ćwiczyć składnię Node.js - Uruchom terminal Node.js REPL

Uruchamiam REPL

REPL można uruchomić, po prostu uruchamiając node w powłoce / konsoli bez żadnych argumentów, jak następuje.

$ node

Zobaczysz wiersz polecenia REPL>, w którym możesz wpisać dowolne polecenie Node.js -

$ node
>

Proste wyrażenie

Spróbujmy prostej matematyki w wierszu polecenia REPL Node.js -

$ node
> 1 + 3
4
> 1 + ( 2 * 3 ) - 4
3
>

Użyj zmiennych

Możesz używać zmiennych do przechowywania wartości i drukowania później, jak każdy konwencjonalny skrypt. Gdybyvarsłowo kluczowe nie jest używane, wartość jest przechowywana w zmiennej i drukowana. Natomiast jeślivarsłowo kluczowe, wartość jest przechowywana, ale nie jest drukowana. Możesz drukować zmienne za pomocąconsole.log().

$ node
> x = 10
10
> var y = 10
undefined
> x + y
20
> console.log("Hello World")
Hello World
undefined

Wyrażenie wielowierszowe

Węzeł REPL obsługuje wyrażenia wielowierszowe podobne do JavaScript. Sprawdźmy następującą pętlę do-while w akcji -

$ node
> var x = 0
undefined
> do {
   ... x++;
   ... console.log("x: " + x);
   ... } 
while ( x < 5 );
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
>

...pojawia się automatycznie po naciśnięciu klawisza Enter po nawiasie otwierającym. Węzeł automatycznie sprawdza ciągłość wyrażeń.

Zmienna podkreślenia

Możesz użyć podkreślenia (_) aby uzyskać ostatni wynik -

$ node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>

Polecenia REPL

  • ctrl + c - kończy bieżące polecenie.

  • ctrl + c twice - zakończ REPL węzła.

  • ctrl + d - zakończ REPL węzła.

  • Up/Down Keys - zobacz historię poleceń i zmodyfikuj poprzednie polecenia.

  • tab Keys - lista aktualnych poleceń.

  • .help - lista wszystkich poleceń.

  • .break - wyjście z wyrażenia wielowierszowego.

  • .clear - wyjście z wyrażenia wielowierszowego.

  • .save filename - zapisz bieżącą sesję REPL węzła do pliku.

  • .load filename - załaduj zawartość pliku w bieżącej sesji Node REPL.

Zatrzymywanie REPL

Jak wspomniano powyżej, będziesz musiał użyć ctrl-c twice wyjść z Node.js REPL.

$ node
>
(^C again to quit)
>

Node Package Manager (NPM) zapewnia dwie główne funkcje -

  • Repozytoria online pakietów / modułów node.js, które można przeszukiwać na search.nodejs.org

  • Narzędzie wiersza poleceń do instalowania pakietów Node.js, zarządzania wersjami i zależnościami pakietów Node.js.

NPM jest dostarczany w pakiecie z instalacjami Node.js po wersji v0.6.3. Aby sprawdzić to samo, otwórz konsolę i wpisz następujące polecenie i zobacz wynik -

$ npm --version
2.7.1

Jeśli używasz starej wersji NPM, dość łatwo jest zaktualizować ją do najnowszej wersji. Po prostu użyj następującego polecenia od roota -

$ sudo npm install npm -g
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
[email protected] /usr/lib/node_modules/npm

Instalowanie modułów za pomocą NPM

Istnieje prosta składnia instalacji dowolnego modułu Node.js -

$ npm install <Module Name>

Na przykład poniżej znajduje się polecenie instalacji słynnego modułu struktury sieciowej Node.js o nazwie express -

$ npm install express

Teraz możesz użyć tego modułu w swoim pliku js w następujący sposób -

var express = require('express');

Instalacja globalna vs lokalna

Domyślnie NPM instaluje dowolną zależność w trybie lokalnym. Tutaj tryb lokalny odnosi się do instalacji pakietu w katalogu node_modules znajdującym się w folderze, w którym znajduje się aplikacja Node. Pakiety wdrożone lokalnie są dostępne za pośrednictwem metody require (). Na przykład, kiedy zainstalowaliśmy moduł express, utworzył katalog node_modules w bieżącym katalogu, w którym zainstalował moduł express.

$ ls -l
total 0
drwxr-xr-x 3 root root 20 Mar 17 02:23 node_modules

Alternatywnie możesz użyć npm ls polecenie, aby wyświetlić listę wszystkich lokalnie zainstalowanych modułów.

Globalnie zainstalowane pakiety / zależności są przechowywane w katalogu systemowym. Takie zależności mogą być używane w funkcji CLI (interfejs wiersza poleceń) dowolnego node.js, ale nie można ich importować bezpośrednio przy użyciu funkcji require () w aplikacji Node. Teraz spróbujmy zainstalować moduł ekspresowy przy użyciu instalacji globalnej.

$ npm install express -g

To da podobny wynik, ale moduł zostanie zainstalowany globalnie. Tutaj pierwsza linia pokazuje wersję modułu i lokalizację, w której jest instalowany.

[email protected] /usr/lib/node_modules/express
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
└── [email protected] ([email protected], [email protected])

Możesz użyć następującego polecenia, aby sprawdzić wszystkie moduły zainstalowane globalnie -

$ npm ls -g

Korzystanie z package.json

package.json znajduje się w katalogu głównym dowolnej aplikacji / modułu Node i służy do definiowania właściwości pakietu. Otwórzmy plik package.json pakietu ekspresowego obecnego wnode_modules/express/

{
   "name": "express",
      "description": "Fast, unopinionated, minimalist web framework",
      "version": "4.11.2",
      "author": {
      
         "name": "TJ Holowaychuk",
         "email": "[email protected]"
      },
   
   "contributors": [{
      "name": "Aaron Heckmann",
      "email": "[email protected]"
   }, 
   
   {
      "name": "Ciaran Jessup",
      "email": "[email protected]"
   },
   
   {
      "name": "Douglas Christopher Wilson",
      "email": "[email protected]"
   },
   
   {
      "name": "Guillermo Rauch",
      "email": "[email protected]"
   },
   
   {
      "name": "Jonathan Ong",
      "email": "[email protected]"
   },
   
   {
      "name": "Roman Shtylman",
      "email": "[email protected]"
   },
   
   {
      "name": "Young Jae Sim",
      "email": "[email protected]"
   } ],
   
   "license": "MIT", "repository": {
      "type": "git",
      "url": "https://github.com/strongloop/express"
   },
   
   "homepage": "https://expressjs.com/", "keywords": [
      "express",
      "framework",
      "sinatra",
      "web",
      "rest",
      "restful",
      "router",
      "app",
      "api"
   ],
   
   "dependencies": {
      "accepts": "~1.2.3",
      "content-disposition": "0.5.0",
      "cookie-signature": "1.0.5",
      "debug": "~2.1.1",
      "depd": "~1.0.0",
      "escape-html": "1.0.1",
      "etag": "~1.5.1",
      "finalhandler": "0.3.3",
      "fresh": "0.2.4",
      "media-typer": "0.3.0",
      "methods": "~1.1.1",
      "on-finished": "~2.2.0",
      "parseurl": "~1.3.0",
      "path-to-regexp": "0.1.3",
      "proxy-addr": "~1.0.6",
      "qs": "2.3.3",
      "range-parser": "~1.0.2",
      "send": "0.11.1",
      "serve-static": "~1.8.1",
      "type-is": "~1.5.6",
      "vary": "~1.0.0",
      "cookie": "0.1.2",
      "merge-descriptors": "0.0.2",
      "utils-merge": "1.0.0"
   },
   
   "devDependencies": {
      "after": "0.8.1",
      "ejs": "2.1.4",
      "istanbul": "0.3.5",
      "marked": "0.3.3",
      "mocha": "~2.1.0",
      "should": "~4.6.2",
      "supertest": "~0.15.0",
      "hjs": "~0.0.6",
      "body-parser": "~1.11.0",
      "connect-redis": "~2.2.0",
      "cookie-parser": "~1.3.3",
      "express-session": "~1.10.2",
      "jade": "~1.9.1",
      "method-override": "~2.3.1",
      "morgan": "~1.5.1",
      "multiparty": "~4.1.1",
      "vhost": "~3.0.0"
   },
   
   "engines": {
      "node": ">= 0.10.0"
   },
   
   "files": [
      "LICENSE",
      "History.md",
      "Readme.md",
      "index.js",
      "lib/"
   ],
   
   "scripts": {
      "test": "mocha --require test/support/env 
         --reporter spec --bail --check-leaks test/ test/acceptance/",
      "test-cov": "istanbul cover node_modules/mocha/bin/_mocha 
         -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
      "test-tap": "mocha --require test/support/env 
         --reporter tap --check-leaks test/ test/acceptance/",
      "test-travis": "istanbul cover node_modules/mocha/bin/_mocha 
         --report lcovonly -- --require test/support/env 
         --reporter spec --check-leaks test/ test/acceptance/"
   },
   
   "gitHead": "63ab25579bda70b4927a179b580a9c580b6c7ada",
   "bugs": {
      "url": "https://github.com/strongloop/express/issues"
   },
   
   "_id": "[email protected]",
   "_shasum": "8df3d5a9ac848585f00a0777601823faecd3b148",
   "_from": "express@*",
   "_npmVersion": "1.4.28",
   "_npmUser": {
      "name": "dougwilson",
      "email": "[email protected]"
   },
   
   "maintainers": [{
      "name": "tjholowaychuk",
      "email": "[email protected]"
   },
   
   {
      "name": "jongleberry",
      "email": "[email protected]"
   },
   
   {
      "name": "shtylman",
      "email": "[email protected]"
   },
   
   {
      "name": "dougwilson",
      "email": "[email protected]"
   },
   
   {
      "name": "aredridel",
      "email": "[email protected]"
   },
   
   {
      "name": "strongloop",
      "email": "[email protected]"
   },
   
   {
      "name": "rfeng",
      "email": "[email protected]"
   }],
   
   "dist": {
      "shasum": "8df3d5a9ac848585f00a0777601823faecd3b148",
      "tarball": "https://registry.npmjs.org/express/-/express-4.11.2.tgz"
   },
   
   "directories": {},
      "_resolved": "https://registry.npmjs.org/express/-/express-4.11.2.tgz",
      "readme": "ERROR: No README data found!"
}

Atrybuty Package.json

  • name - nazwa pakietu

  • version - wersja pakietu

  • description - opis pakietu

  • homepage - strona główna pakietu

  • author - autor pakietu

  • contributors - nazwiska współpracowników pakietu

  • dependencies- lista zależności. NPM automatycznie instaluje wszystkie wymienione tutaj zależności w folderze node_module pakietu.

  • repository - typ repozytorium i adres URL pakietu

  • main - punkt wejścia pakietu

  • keywords - słowa kluczowe

Odinstalowanie modułu

Użyj następującego polecenia, aby odinstalować moduł Node.js.

$ npm uninstall express

Gdy NPM odinstaluje pakiet, możesz go zweryfikować, patrząc na zawartość katalogu / node_modules / lub wpisz następujące polecenie -

$ npm ls

Aktualizacja modułu

Zaktualizuj plik package.json i zmień wersję zależności, która ma zostać zaktualizowana, i uruchom następujące polecenie.

$ npm update express

Wyszukaj moduł

Wyszukaj nazwę pakietu za pomocą NPM.

$ npm search express

Utwórz moduł

Utworzenie modułu wymaga wygenerowania pliku package.json. Wygenerujmy plik package.json za pomocą NPM, który wygeneruje podstawowy szkielet pakietu package.json.

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See 'npm help json' for definitive documentation on these fields
and exactly what they do.

Use 'npm install <pkg> --save' afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (webmaster)

Będziesz musiał podać wszystkie wymagane informacje o swoim module. Możesz skorzystać z pomocy wspomnianego powyżej pliku package.json, aby zrozumieć znaczenie różnych żądanych informacji. Po wygenerowaniu pliku package.json użyj następującego polecenia, aby zarejestrować się w witrynie repozytorium NPM przy użyciu prawidłowego adresu e-mail.

$ npm adduser
Username: mcmohd
Password:
Email: (this IS public) [email protected]

Nadszedł czas, aby opublikować Twój moduł -

$ npm publish

Jeśli z Twoim modułem wszystko jest w porządku, zostanie on opublikowany w repozytorium i będzie można go zainstalować za pomocą NPM, tak jak każdy inny moduł Node.js.

Co to jest oddzwonienie?

Callback jest asynchronicznym odpowiednikiem funkcji. Funkcja zwrotna jest wywoływana po zakończeniu danego zadania. Węzeł intensywnie korzysta z wywołań zwrotnych. Wszystkie interfejsy API Node są napisane w taki sposób, że obsługują wywołania zwrotne.

Na przykład funkcja odczytująca plik może rozpocząć odczytywanie pliku i natychmiast zwrócić sterowanie do środowiska wykonawczego, aby można było wykonać następną instrukcję. Po zakończeniu operacji we / wy pliku, wywoła funkcję zwrotną podczas przekazywania funkcji zwrotnej, zawartość pliku jako parametr. Nie ma więc blokowania ani oczekiwania na wejście / wyjście pliku. To sprawia, że ​​Node.js jest wysoce skalowalny, ponieważ może przetwarzać dużą liczbę żądań bez czekania, aż żadna funkcja zwróci wyniki.

Przykład kodu blokującego

Utwórz plik tekstowy o nazwie input.txt o następującej treści -

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Utwórz plik js o nazwie main.js z następującym kodem -

var fs = require("fs");
var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("Program Ended");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Program Ended

Przykład kodu nieblokującego

Utwórz plik tekstowy o nazwie input.txt z następującą zawartością.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Zaktualizuj plik main.js, aby miał następujący kod -

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Te dwa przykłady wyjaśniają koncepcję połączeń blokujących i nieblokujących.

  • Pierwszy przykład pokazuje, że program blokuje się, dopóki nie odczyta pliku, a dopiero potem przechodzi do zakończenia programu.

  • Drugi przykład pokazuje, że program nie czeka na odczytanie pliku i kontynuuje drukowanie "Program zakończony", a jednocześnie program bez blokowania kontynuuje odczytywanie pliku.

W ten sposób program blokujący jest wykonywany bardzo sekwencyjnie. Z punktu widzenia programowania łatwiej jest wdrożyć logikę, ale programy nieblokujące nie są wykonywane po kolei. W przypadku, gdy program musi użyć jakichkolwiek danych do przetworzenia, powinien być przechowywany w tym samym bloku, aby był wykonywany sekwencyjnie.

Node.js jest aplikacją jednowątkową, ale może obsługiwać współbieżność za pośrednictwem koncepcji event i callbacks. Każdy interfejs API Node.js jest asynchroniczny i jest jednowątkowy, z którego korzystająasync function callsaby zachować współbieżność. Węzeł używa wzorca obserwatora. Wątek węzła utrzymuje pętlę zdarzeń i za każdym razem, gdy zadanie zostanie ukończone, wywołuje odpowiednie zdarzenie, które sygnalizuje wykonanie funkcji nasłuchiwania zdarzeń.

Programowanie sterowane zdarzeniami

Node.js intensywnie wykorzystuje zdarzenia i jest to również jeden z powodów, dla których Node.js jest dość szybki w porównaniu z innymi podobnymi technologiami. Gdy tylko Node uruchomi swój serwer, po prostu inicjuje swoje zmienne, deklaruje funkcje, a następnie po prostu czeka na wystąpienie zdarzenia.

W aplikacji sterowanej zdarzeniami istnieje zazwyczaj główna pętla, która nasłuchuje zdarzeń, a następnie wyzwala funkcję zwrotną po wykryciu jednego z tych zdarzeń.

Chociaż zdarzenia wyglądają dość podobnie do wywołań zwrotnych, różnica polega na tym, że funkcje zwrotne są wywoływane, gdy funkcja asynchroniczna zwraca swój wynik, podczas gdy obsługa zdarzeń działa na wzorcu obserwatora. Funkcje nasłuchujące zdarzeń działają jakObservers. Za każdym razem, gdy zdarzenie zostanie wyzwolone, jego funkcja detektora zaczyna działać. Node.js ma wiele wbudowanych zdarzeń dostępnych za pośrednictwem modułu zdarzeń i klasy EventEmitter, które są używane do wiązania zdarzeń i detektorów zdarzeń w następujący sposób -

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

Poniżej znajduje się składnia powiązania procedury obsługi zdarzeń ze zdarzeniem -

// Bind event and event  handler as follows
eventEmitter.on('eventName', eventHandler);

Możemy uruchomić zdarzenie programowo w następujący sposób -

// Fire an event 
eventEmitter.emit('eventName');

Przykład

Utwórz plik js o nazwie main.js z następującym kodem -

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// Create an event handler as follows
var connectHandler = function connected() {
   console.log('connection succesful.');
  
   // Fire the data_received event 
   eventEmitter.emit('data_received');
}

// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
 
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
   console.log('data received succesfully.');
});

// Fire the connection event 
eventEmitter.emit('connection');

console.log("Program Ended.");

Teraz spróbujmy uruchomić powyższy program i sprawdzić jego dane wyjściowe -

$ node main.js

Powinno dać następujący wynik -

connection successful.
data received successfully.
Program Ended.

Jak działają aplikacje węzłów?

W aplikacji węzła każda funkcja asynchroniczna akceptuje wywołanie zwrotne jako ostatni parametr, a funkcja zwrotna przyjmuje błąd jako pierwszy parametr. Wróćmy jeszcze raz do poprzedniego przykładu. Utwórz plik tekstowy o nazwie input.txt z następującą zawartością.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Utwórz plik js o nazwie main.js z następującym kodem -

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) {
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("Program Ended");

Tutaj fs.readFile () jest funkcją asynchroniczną, której celem jest odczytanie pliku. Jeśli podczas operacji odczytu wystąpi błąd, plikerr object będzie zawierał odpowiedni błąd, w przeciwnym razie dane będą zawierały zawartość pliku. readFile przekazuje err i dane do funkcji zwrotnej po zakończeniu operacji odczytu, która ostatecznie wypisuje zawartość.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Wiele obiektów w węźle emituje zdarzenia, na przykład net.Server emituje zdarzenie za każdym razem, gdy łączy się z nim peer, a fs.readStream emituje zdarzenie, gdy plik jest otwierany. Wszystkie obiekty, które emitują zdarzenia, są instancjami zdarzeń Events.EventEmitter.

Klasa EventEmitter

Jak widzieliśmy w poprzedniej sekcji, klasa EventEmitter znajduje się w module zdarzeń. Jest dostępny za pomocą następującego kodu -

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

Gdy instancja EventEmitter napotka jakikolwiek błąd, emituje zdarzenie „błąd”. Po dodaniu nowego detektora wyzwalane jest zdarzenie „newListener”, a po usunięciu detektora - zdarzenie „removeListener”.

EventEmitter udostępnia wiele właściwości, takich jak on i emit. on Właściwość służy do wiązania funkcji ze zdarzeniem i emit służy do wywołania zdarzenia.

Metody

Sr.No. Metoda i opis
1

addListener(event, listener)

Dodaje detektor na końcu tablicy detektorów dla określonego zdarzenia. Nie są sprawdzane, czy słuchacz został już dodany. Wiele wywołań przekazujących tę samą kombinację zdarzenia i detektora spowoduje wielokrotne dodawanie detektora. Zwraca emiter, więc połączenia można łączyć.

2

on(event, listener)

Dodaje detektor na końcu tablicy detektorów dla określonego zdarzenia. Nie są sprawdzane, czy słuchacz został już dodany. Wiele wywołań przekazujących tę samą kombinację zdarzenia i detektora spowoduje wielokrotne dodawanie detektora. Zwraca emiter, więc połączenia można łączyć.

3

once(event, listener)

Dodaje jednorazowego nasłuchiwania do zdarzenia. Ten detektor jest wywoływany tylko przy następnym uruchomieniu zdarzenia, po czym jest usuwany. Zwraca emiter, więc połączenia można łączyć.

4

removeListener(event, listener)

Usuwa detektor z tablicy detektorów dla określonego zdarzenia. Caution −Zmienia indeksy tablic w tablicy listener za listener. removeListener usunie co najwyżej jedną instancję detektora z tablicy listener. Jeśli jakikolwiek pojedynczy detektor został dodany wiele razy do tablicy detektorów dla określonego zdarzenia, removeListener musi zostać wywołana wiele razy, aby usunąć każde wystąpienie. Zwraca emiter, więc połączenia można łączyć.

5

removeAllListeners([event])

Usuwa wszystkie detektory lub te z określonego zdarzenia. Nie jest dobrym pomysłem usuwanie odbiorników, które zostały dodane w innym miejscu kodu, zwłaszcza gdy są one na emiterze, którego nie utworzyłeś (np. Gniazda lub strumienie plików). Zwraca emiter, więc połączenia można łączyć.

6

setMaxListeners(n)

Domyślnie EventEmitters wydrukuje ostrzeżenie, jeśli dla określonego zdarzenia zostanie dodanych więcej niż 10 detektorów. Jest to przydatne ustawienie domyślne, które pomaga znaleźć wycieki pamięci. Oczywiście nie wszystkie emitery powinny być ograniczone do 10. Ta funkcja pozwala na zwiększenie tego. Ustaw na zero dla nieograniczonej liczby.

7

listeners(event)

Zwraca tablicę detektorów dla określonego zdarzenia.

8

emit(event, [arg1], [arg2], [...])

Wykonaj kolejno każdego ze słuchaczy z podanymi argumentami. Zwraca wartość true, jeśli zdarzenie ma detektory, w przeciwnym razie zwraca wartość false.

Metody klasowe

Sr.No. Metoda i opis
1

listenerCount(emitter, event)

Zwraca liczbę detektorów dla danego zdarzenia.

Wydarzenia

Sr.No. Wydarzenia i opis
1

newListener

  • event - Ciąg: nazwa wydarzenia

  • listener - Funkcja: funkcja obsługi zdarzeń

To zdarzenie jest emitowane za każdym razem, gdy dodawany jest odbiornik. Kiedy to zdarzenie jest wyzwalane, detektor mógł nie zostać jeszcze dodany do tablicy detektorów zdarzenia.

2

removeListener

  • event - Ciąg Nazwa zdarzenia

  • listener - Funkcja Funkcja obsługi zdarzeń

To zdarzenie jest emitowane za każdym razem, gdy ktoś usunie słuchacza. Gdy to zdarzenie jest wyzwalane, detektor mógł nie zostać jeszcze usunięty z tablicy detektorów zdarzenia.

Przykład

Utwórz plik js o nazwie main.js z następującym kodem Node.js -

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener #2
var listner2 = function listner2() {
   console.log('listner2 executed.');
}

// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);

// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);

var eventListeners = require('events').EventEmitter.listenerCount
   (eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

// Fire the connection event 
eventEmitter.emit('connection');

// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");

// Fire the connection event 
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

console.log("Program Ended.");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.

Czysty JavaScript jest przyjazny dla Unicode, ale nie jest tak w przypadku danych binarnych. Mając do czynienia ze strumieniami TCP lub systemem plików, należy obsługiwać strumienie oktetów. Węzeł udostępnia klasę Buffer, która udostępnia instancje do przechowywania surowych danych, podobnie jak tablica liczb całkowitych, ale odpowiada alokacji pamięci surowej poza stertą V8.

Klasa bufora to klasa globalna, do której można uzyskać dostęp w aplikacji bez importowania modułu bufora.

Tworzenie buforów

Bufor węzła można skonstruować na wiele sposobów.

Metoda 1

Poniżej znajduje się składnia tworzenia niewtajemniczonego bufora 10 oktety -

var buf = new Buffer(10);

Metoda 2

Poniżej znajduje się składnia tworzenia bufora z podanej tablicy -

var buf = new Buffer([10, 20, 30, 40, 50]);

Metoda 3

Poniżej znajduje się składnia tworzenia bufora z podanego ciągu i opcjonalnie typu kodowania -

var buf = new Buffer("Simply Easy Learning", "utf-8");

Chociaż „utf8” jest kodowaniem domyślnym, można użyć dowolnego z następujących kodowań „ascii”, „utf8”, „utf16le”, „ucs2”, „base64” lub „hex”.

Pisanie do buforów

Składnia

Poniżej znajduje się składnia metody zapisu do bufora węzła:

buf.write(string[, offset][, length][, encoding])

Parametry

Oto opis użytych parametrów -

  • string - To jest ciąg danych do zapisania w buforze.

  • offset- To jest indeks bufora, od którego zaczyna się zapis. Wartość domyślna to 0.

  • length- To jest liczba bajtów do zapisania. Domyślnie bufor.length.

  • encoding- Kodowanie do użycia. Domyślnym kodowaniem jest „utf8”.

Wartość zwracana

Ta metoda zwraca liczbę zapisanych oktetów. Jeśli w buforze nie ma wystarczającej ilości miejsca, aby zmieścić cały ciąg, zapisze część ciągu.

Przykład

buf = new Buffer(256);
len = buf.write("Simply Easy Learning");

console.log("Octets written : "+  len);

Kiedy powyższy program jest wykonywany, daje następujący wynik -

Octets written : 20

Czytanie z buforów

Składnia

Poniżej znajduje się składnia metody odczytu danych z bufora węzła -

buf.toString([encoding][, start][, end])

Parametry

Oto opis użytych parametrów -

  • encoding- Kodowanie do użycia. Domyślnym kodowaniem jest „utf8”.

  • start - Indeks początkowy, aby rozpocząć czytanie, domyślnie 0.

  • end - Koniec indeksu, aby zakończyć czytanie, domyślnie jest to pełny bufor.

Wartość zwracana

Ta metoda dekoduje i zwraca ciąg z danych buforu zakodowanych przy użyciu określonego kodowania zestawu znaków.

Przykład

buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // outputs: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   // outputs: abcde
console.log( buf.toString('utf8',0,5));    // outputs: abcde
console.log( buf.toString(undefined,0,5)); // encoding defaults to 'utf8', outputs abcde

Kiedy powyższy program jest wykonywany, daje następujący wynik -

abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde

Konwertuj bufor na JSON

Składnia

Poniżej przedstawiono składnię metody konwersji buforu węzła na obiekt JSON -

buf.toJSON()

Wartość zwracana

Ta metoda zwraca reprezentację JSON wystąpienia Buffer.

Przykład

var buf = new Buffer('Simply Easy Learning');
var json = buf.toJSON(buf);

console.log(json);

Kiedy powyższy program jest wykonywany, daje następujący wynik -

{ type: 'Buffer',
   data: 
   [ 
      83,
      105,
      109,
      112,
      108,
      121,
      32,
      69,
      97,
      115,
      121,
      32,
      76,
      101,
      97,
      114,
      110,
      105,
      110,
      103 
   ]
}

Bufory łączone

Składnia

Poniżej znajduje się składnia metody łączenia buforów węzła z pojedynczym buforem węzła -

Buffer.concat(list[, totalLength])

Parametry

Oto opis użytych parametrów -

  • list - Array Lista obiektów Buffer do konkatenacji.

  • totalLength - To jest całkowita długość buforów po połączeniu.

Wartość zwracana

Ta metoda zwraca wystąpienie Buffer.

Przykład

var buffer1 = new Buffer('TutorialsPoint ');
var buffer2 = new Buffer('Simply Easy Learning');
var buffer3 = Buffer.concat([buffer1,buffer2]);

console.log("buffer3 content: " + buffer3.toString());

Kiedy powyższy program jest wykonywany, daje następujący wynik -

buffer3 content: TutorialsPoint Simply Easy Learning

Porównaj bufory

Składnia

Poniżej przedstawiono składnię metody porównywania dwóch buforów węzłów -

buf.compare(otherBuffer);

Parametry

Oto opis użytych parametrów -

  • otherBuffer - To jest drugi bufor, z którym będziemy porównywać buf

Wartość zwracana

Zwraca liczbę wskazującą, czy występuje przed, czy po, czy też jest taka sama jak otherBuffer w kolejności sortowania.

Przykład

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
   console.log(buffer1 +" comes before " + buffer2);
} else if(result === 0) {
   console.log(buffer1 +" is same as " + buffer2);
} else {
   console.log(buffer1 +" comes after " + buffer2);
}

Kiedy powyższy program jest wykonywany, daje następujący wynik -

ABC comes before ABCD

Kopiuj bufor

Składnia

Poniżej znajduje się składnia metody kopiowania bufora węzła -

buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

Parametry

Oto opis użytych parametrów -

  • targetBuffer - Obiekt bufora, do którego zostanie skopiowany bufor.

  • targetStart - Liczba, opcjonalnie, domyślnie: 0

  • sourceStart - Liczba, opcjonalnie, domyślnie: 0

  • sourceEnd - Liczba, opcjonalnie, domyślnie: długość bufora

Wartość zwracana

Brak wartości zwracanej. Kopiuje dane z regionu tego buforu do regionu w buforze docelowym, nawet jeśli docelowy region pamięci nakłada się na źródło. Jeśli nie jest zdefiniowana, parametry targetStart i sourceStart mają domyślnie wartość 0, a sourceEnd przyjmuje wartość domyślną buffer.length.

Przykład

var buffer1 = new Buffer('ABC');

//copy a buffer
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

Kiedy powyższy program jest wykonywany, daje następujący wynik -

buffer2 content: ABC

Slice Buffer

Składnia

Poniżej znajduje się składnia metody uzyskiwania bufora podrzędnego bufora węzła -

buf.slice([start][, end])

Parametry

Oto opis użytych parametrów -

  • start - Liczba, opcjonalnie, domyślnie: 0

  • end - Liczba, opcjonalnie, domyślnie: długość bufora

Wartość zwracana

Zwraca nowy bufor, który odwołuje się do tej samej pamięci co stary, ale jest przesunięty i przycięty przez indeksy początkowy (domyślnie 0) i końcowy (domyślnie bufor.length). Indeksy ujemne zaczynają się od końca bufora.

Przykład

var buffer1 = new Buffer('TutorialsPoint');

//slicing a buffer
var buffer2 = buffer1.slice(0,9);
console.log("buffer2 content: " + buffer2.toString());

Kiedy powyższy program jest wykonywany, daje następujący wynik -

buffer2 content: Tutorials

Długość bufora

Składnia

Poniżej przedstawiono składnię metody uzyskiwania rozmiaru buforu węzła w bajtach -

buf.length;

Wartość zwracana

Zwraca rozmiar buforu w bajtach.

Przykład

var buffer = new Buffer('TutorialsPoint');

//length of the buffer
console.log("buffer length: " + buffer.length);

Wykonanie powyższego programu daje następujący wynik -

buffer length: 14

Odniesienie do metod

Sr.No. Metoda i opis
1

new Buffer(size)

Przydziela nowy bufor o rozmiarze oktetów. Należy pamiętać, że rozmiar nie może być większy niż kMaxLength. W przeciwnym razie zostanie tutaj wyrzucony RangeError.

2

new Buffer(buffer)

Kopiuje przekazane dane buforu do nowej instancji Buffer.

3

new Buffer(str[, encoding])

Przydziela nowy bufor zawierający daną str. kodowanie domyślne to „utf8”.

4

buf.length

Zwraca rozmiar buforu w bajtach. Zwróć uwagę, że niekoniecznie jest to rozmiar zawartości. length odnosi się do ilości pamięci przydzielonej dla obiektu bufora. Nie zmienia się, gdy zmienia się zawartość bufora.

5

buf.write(string[, offset][, length][, encoding])

Zapisuje ciąg w buforze z przesunięciem przy użyciu podanego kodowania. offset domyślnie wynosi 0, kodowanie domyślne to „utf8”. length to liczba bajtów do zapisania. Zwraca liczbę zapisanych oktetów.

6

buf.writeUIntLE(value, offset, byteLength[, noAssert])

Zapisuje wartość w buforze przy określonym przesunięciu i byteLength. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Domyślnie false.

7

buf.writeUIntBE(value, offset, byteLength[, noAssert])

Zapisuje wartość w buforze przy określonym przesunięciu i byteLength. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Domyślnie false.

8

buf.writeIntLE(value, offset, byteLength[, noAssert])

Zapisuje wartość w buforze przy określonym przesunięciu i byteLength. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Domyślnie false.

9

buf.writeIntBE(value, offset, byteLength[, noAssert])

Zapisuje wartość w buforze przy określonym przesunięciu i byteLength. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Domyślnie false.

10

buf.readUIntLE(offset, byteLength[, noAssert])

Uogólniona wersja wszystkich numerycznych metod odczytu. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

11

buf.readUIntBE(offset, byteLength[, noAssert])

Uogólniona wersja wszystkich numerycznych metod odczytu. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

12

buf.readIntLE(offset, byteLength[, noAssert])

Uogólniona wersja wszystkich numerycznych metod odczytu. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

13

buf.readIntBE(offset, byteLength[, noAssert])

Uogólniona wersja wszystkich numerycznych metod odczytu. Obsługuje do 48 bitów dokładności. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

14

buf.toString([encoding][, start][, end])

Dekoduje i zwraca ciąg z danych bufora zakodowanych przy użyciu określonego kodowania zestawu znaków.

15

buf.toJSON()

Zwraca reprezentację JSON wystąpienia Buffer. JSON.stringify niejawnie wywołuje tę funkcję podczas tworzenia ciągu znaków dla wystąpienia buforu.

16

buf[index]

Pobierz i ustaw oktet na indeks. Wartości odnoszą się do pojedynczych bajtów, więc dozwolony zakres wynosi od 0x00 do 0xFF szesnastkowo lub od 0 do 255.

17

buf.equals(otherBuffer)

Zwraca wartość logiczną, jeśli ten bufor i otherBuffer mają te same bajty.

18

buf.compare(otherBuffer)

Zwraca liczbę wskazującą, czy ten bufor znajduje się przed, czy po, czy też jest taki sam jak otherBuffer w kolejności sortowania.

19

buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

Kopiuje dane z regionu tego buforu do regionu w buforze docelowym, nawet jeśli docelowy region pamięci nakłada się na źródło. Jeśli nie jest zdefiniowana, parametry targetStart i sourceStart mają domyślnie wartość 0, a sourceEnd przyjmuje wartość domyślną buffer.length.

20

buf.slice([start][, end])

Zwraca nowy bufor, który odwołuje się do tej samej pamięci co stary, ale przesunięty i przycięty przez indeksy początkowy (domyślnie 0) i końcowy (domyślnie bufor.length). Indeksy ujemne zaczynają się od końca bufora.

21

buf.readUInt8(offset[, noAssert])

Odczytuje 8-bitową liczbę całkowitą bez znaku z bufora przy określonym przesunięciu. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

22

buf.readUInt16LE(offset[, noAssert])

Odczytuje 16-bitową liczbę całkowitą bez znaku z bufora o określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

23

buf.readUInt16BE(offset[, noAssert])

Odczytuje 16-bitową liczbę całkowitą bez znaku z bufora o określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

24

buf.readUInt32LE(offset[, noAssert])

Odczytuje 32-bitową liczbę całkowitą bez znaku z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

25

buf.readUInt32BE(offset[, noAssert])

Odczytuje 32-bitową liczbę całkowitą bez znaku z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

26

buf.readInt8(offset[, noAssert])

Odczytuje 8-bitową liczbę całkowitą ze znakiem z bufora przy określonym przesunięciu. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

27

buf.readInt16LE(offset[, noAssert])

Odczytuje 16-bitową liczbę całkowitą ze znakiem z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

28

buf.readInt16BE(offset[, noAssert])

Odczytuje 16-bitową liczbę całkowitą ze znakiem z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

29

buf.readInt32LE(offset[, noAssert])

Odczytuje podpisaną 32-bitową liczbę całkowitą z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

30

buf.readInt32BE(offset[, noAssert])

Odczytuje podpisaną 32-bitową liczbę całkowitą z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

31

buf.readFloatLE(offset[, noAssert])

Odczytuje 32-bitową liczbę zmiennoprzecinkową z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

32

buf.readFloatBE(offset[, noAssert])

Odczytuje 32-bitową liczbę zmiennoprzecinkową z bufora przy określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

33

buf.readDoubleLE(offset[, noAssert])

Odczytuje 64-bitowy double z bufora o określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

34

buf.readDoubleBE(offset[, noAssert])

Odczytuje 64-bitowy double z bufora o określonym przesunięciu z określonym formatem Endian. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności przesunięcia. Oznacza to, że przesunięcie może znajdować się poza końcem bufora. Domyślnie false.

35

buf.writeUInt8(value, offset[, noAssert])

Zapisuje wartość w buforze przy określonym przesunięciu. Zwróć uwagę, że wartość musi być prawidłową 8-bitową liczbą całkowitą bez znaku. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

36

buf.writeUInt16LE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Zwróć uwagę, że wartość musi być prawidłową 16-bitową liczbą całkowitą bez znaku. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie masz pewności co do poprawności. Domyślnie false.

37

buf.writeUInt16BE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Zwróć uwagę, że wartość musi być prawidłową 16-bitową liczbą całkowitą bez znaku. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

38

buf.writeUInt32LE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Należy pamiętać, że wartość musi być prawidłową 32-bitową liczbą całkowitą bez znaku. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

39

buf.writeUInt32BE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Należy pamiętać, że wartość musi być prawidłową 32-bitową liczbą całkowitą bez znaku. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

40

buf.writeInt8(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Należy pamiętać, że wartość musi być prawidłową 8-bitową liczbą całkowitą ze znakiem. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

41

buf.writeInt16LE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Należy pamiętać, że wartość musi być prawidłową 16-bitową liczbą całkowitą ze znakiem. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

42

buf.writeInt16BE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Należy pamiętać, że wartość musi być prawidłową 16-bitową liczbą całkowitą ze znakiem. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

43

buf.writeInt32LE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Należy pamiętać, że wartość musi być prawidłową 32-bitową liczbą całkowitą ze znakiem. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

44

buf.writeInt32BE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Należy pamiętać, że wartość musi być prawidłową 32-bitową liczbą całkowitą ze znakiem. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie masz pewności co do poprawności. Domyślnie false.

45

buf.writeFloatLE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Zauważ, że wartość musi być poprawną 32-bitową liczbą zmiennoprzecinkową. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może znajdować się poza końcem bufora, co prowadzi do cichego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

46

buf.writeFloatBE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Uwaga, wartość musi być prawidłową 32-bitową liczbą zmiennoprzecinkową. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

47

buf.writeDoubleLE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Uwaga, wartość musi być poprawną 64-bitową podwójną wartością. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

48

buf.writeDoubleBE(value, offset[, noAssert])

Zapisuje wartość w buforze o określonym przesunięciu z określonym formatem Endian. Uwaga, wartość musi być poprawną 64-bitową podwójną wartością. Ustaw noAssert na true, aby pominąć sprawdzanie poprawności wartości i przesunięcia. Oznacza to, że wartość może być zbyt duża dla określonej funkcji, a przesunięcie może wykraczać poza koniec bufora, co prowadzi do dyskretnego odrzucania wartości. Nie należy go używać, jeśli nie jesteś pewien jego poprawności. Domyślnie false.

49

buf.fill(value[, offset][, end])

Wypełnia bufor określoną wartością. Jeśli przesunięcie (domyślnie 0) i koniec (domyślnie bufor.length) nie są podane, wypełni cały bufor.

Metody klasowe

Sr.No. Metoda i opis
1

Buffer.isEncoding(encoding)

Zwraca wartość true, jeśli kodowanie jest prawidłowym argumentem kodowania, w przeciwnym razie zwraca wartość false.

2

Buffer.isBuffer(obj)

Sprawdza, czy obj jest buforem.

3

Buffer.byteLength(string[, encoding])

Podaje rzeczywistą długość w bajtach łańcucha. kodowanie domyślne to „utf8”. To nie to samo, co String.prototype.length, ponieważ String.prototype.length zwraca liczbę znaków w ciągu.

4

Buffer.concat(list[, totalLength])

Zwraca bufor będący wynikiem konkatenacji wszystkich buforów na liście.

5

Buffer.compare(buf1, buf2)

To samo co buf1.compare (buf2). Przydatne do sortowania tablicy buforów.

Co to są strumienie?

Strumienie to obiekty, które umożliwiają ciągłe odczytywanie danych ze źródła lub zapisywanie danych w miejscu docelowym. W Node.js istnieją cztery typy strumieni -

  • Readable - Strumień używany do operacji odczytu.

  • Writable - Strumień używany do operacji zapisu.

  • Duplex - Strumień, który może być używany zarówno do operacji odczytu, jak i zapisu.

  • Transform - Typ strumienia dupleksowego, w którym dane wyjściowe są obliczane na podstawie danych wejściowych.

Każdy typ strumienia to plik EventEmitterinstancja i wyrzuca kilka zdarzeń w różnych momentach. Na przykład niektóre z powszechnie używanych zdarzeń to -

  • data - To zdarzenie jest uruchamiane, gdy dostępne są dane do odczytania.

  • end - To zdarzenie jest uruchamiane, gdy nie ma więcej danych do odczytania.

  • error - To zdarzenie jest uruchamiane, gdy wystąpi błąd podczas odbierania lub zapisywania danych.

  • finish - To zdarzenie jest wywoływane, gdy wszystkie dane zostały przeniesione do systemu bazowego.

W tym samouczku przedstawiono podstawowe informacje na temat często używanych operacji na strumieniach.

Czytanie ze strumienia

Utwórz plik tekstowy o nazwie input.txt o następującej zawartości -

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Utwórz plik js o nazwie main.js z następującym kodem -

var fs = require("fs");
var data = '';

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Set the encoding to be utf8. 
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function() {
   console.log(data);
});

readerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Pisanie do strumienia

Utwórz plik js o nazwie main.js z następującym kodem -

var fs = require("fs");
var data = 'Simply Easy Learning';

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Write the data to stream with encoding to be utf8
writerStream.write(data,'UTF8');

// Mark the end of file
writerStream.end();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});

writerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Program Ended
Write completed.

Teraz otwórz plik output.txt utworzony w bieżącym katalogu; powinien zawierać:

Simply Easy Learning

Orurowanie strumieni

Piping to mechanizm, w którym dane wyjściowe jednego strumienia są dostarczane jako dane wejściowe do innego strumienia. Zwykle jest używany do pobierania danych z jednego strumienia i przekazywania danych wyjściowych tego strumienia do innego strumienia. Nie ma ograniczeń co do operacji związanych z rurociągami. Teraz pokażemy przykład potoku do odczytu z jednego pliku i zapisania go w innym pliku.

Utwórz plik js o nazwie main.js z następującym kodem -

var fs = require("fs");

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Pipe the read and write operations
// read input.txt and write data to output.txt
readerStream.pipe(writerStream);

console.log("Program Ended");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Program Ended

Otwórz plik output.txt utworzony w bieżącym katalogu; powinien zawierać:

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Łańcuch strumieni

Łańcuch to mechanizm łączenia danych wyjściowych jednego strumienia z innym strumieniem i tworzenia łańcucha operacji wielostrumieniowych. Zwykle jest używany do operacji związanych z rurociągami. Teraz użyjemy pipingu i łańcuchów, aby najpierw skompresować plik, a następnie go zdekompresować.

Utwórz plik js o nazwie main.js z następującym kodem -

var fs = require("fs");
var zlib = require('zlib');

// Compress the file input.txt to input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("File Compressed.");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

File Compressed.

Przekonasz się, że plik input.txt został skompresowany i utworzył plik input.txt.gz w bieżącym katalogu. Teraz spróbujmy zdekompresować ten sam plik przy użyciu następującego kodu -

var fs = require("fs");
var zlib = require('zlib');

// Decompress the file input.txt.gz to input.txt
fs.createReadStream('input.txt.gz')
   .pipe(zlib.createGunzip())
   .pipe(fs.createWriteStream('input.txt'));
  
console.log("File Decompressed.");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

File Decompressed.

Węzeł implementuje operacje we / wy plików przy użyciu prostych opakowań wokół standardowych funkcji POSIX. Moduł Node File System (fs) można zaimportować przy użyciu następującej składni -

var fs = require("fs")

Synchroniczne vs asynchroniczne

Każda metoda w module fs ma zarówno formy synchroniczne, jak i asynchroniczne. Metody asynchroniczne przyjmują ostatni parametr jako wywołanie zwrotne funkcji uzupełniania, a pierwszy parametr funkcji zwrotnej jako błąd. Lepiej jest zastosować metodę asynchroniczną niż synchroniczną, ponieważ ta pierwsza nigdy nie blokuje programu podczas jego wykonywania, a druga tak.

Przykład

Utwórz plik tekstowy o nazwie input.txt o następującej treści -

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Utwórzmy plik js o nazwie main.js z następującym kodem -

var fs = require("fs");

// Asynchronous read
fs.readFile('input.txt', function (err, data) {
   if (err) {
      return console.error(err);
   }
   console.log("Asynchronous read: " + data.toString());
});

// Synchronous read
var data = fs.readFileSync('input.txt');
console.log("Synchronous read: " + data.toString());

console.log("Program Ended");

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Synchronous read: Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Program Ended
Asynchronous read: Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Kolejne sekcje tego rozdziału zawierają zestaw dobrych przykładów głównych metod wejścia / wyjścia plików.

Otworzyć plik

Składnia

Poniżej znajduje się składnia metody otwierania pliku w trybie asynchronicznym -

fs.open(path, flags[, mode], callback)

Parametry

Oto opis użytych parametrów -

  • path - To jest ciąg zawierający nazwę pliku zawierającą ścieżkę.

  • flags- Flagi wskazują zachowanie pliku do otwarcia. Wszystkie możliwe wartości zostały wymienione poniżej.

  • mode- Ustawia tryb pliku (uprawnienia i lepkie bity), ale tylko wtedy, gdy plik został utworzony. Domyślnie jest to 0666, z możliwością odczytu i zapisu.

  • callback - To jest funkcja zwrotna, która pobiera dwa argumenty (err, fd).

Flagi

Flagi operacji odczytu / zapisu to -

Sr.No. Flaga i opis
1

r

Otwórz plik do odczytu. Wyjątek występuje, jeśli plik nie istnieje.

2

r+

Otwórz plik do czytania i pisania. Wyjątek występuje, jeśli plik nie istnieje.

3

rs

Otwórz plik do odczytu w trybie synchronicznym.

4

rs+

Otwórz plik do odczytu i zapisu, prosząc system operacyjny o synchroniczne otwarcie go. Zobacz uwagi dotyczące „rs” na temat używania tego z ostrożnością.

5

w

Otwórz plik do zapisu. Plik jest tworzony (jeśli nie istnieje) lub obcięty (jeśli istnieje).

6

wx

Jak „w”, ale zawodzi, jeśli ścieżka istnieje.

7

w+

Otwórz plik do czytania i pisania. Plik jest tworzony (jeśli nie istnieje) lub obcięty (jeśli istnieje).

8

wx+

Jak „w +”, ale kończy się niepowodzeniem, jeśli ścieżka istnieje.

9

a

Otwórz plik do dołączenia. Plik jest tworzony, jeśli nie istnieje.

10

ax

Jak „a”, ale kończy się niepowodzeniem, jeśli ścieżka istnieje.

11

a+

Otwórz plik do odczytu i dołączenia. Plik jest tworzony, jeśli nie istnieje.

12

ax+

Podobnie jak „a +”, ale kończy się niepowodzeniem, jeśli ścieżka istnieje.

Przykład

Utwórzmy plik js o nazwie main.js mając następujący kod, aby otworzyć plik input.txt do odczytu i zapisu.

var fs = require("fs");

// Asynchronous - Opening File
console.log("Going to open file!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");     
});

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Going to open file!
File opened successfully!

Uzyskaj informacje o pliku

Składnia

Poniżej przedstawiono składnię metody uzyskiwania informacji o pliku -

fs.stat(path, callback)

Parametry

Oto opis użytych parametrów -

  • path - To jest ciąg zawierający nazwę pliku zawierającą ścieżkę.

  • callback - To jest funkcja zwrotna, która pobiera dwa argumenty (błąd, statystyki) gdzie stats jest obiektem typu fs.Stats, który jest pokazany poniżej w przykładzie.

Oprócz ważnych atrybutów, które są wydrukowane poniżej w przykładzie, dostępnych jest kilka przydatnych metod fs.Statsklasa, której można użyć do sprawdzenia typu pliku. Metody te podano w poniższej tabeli.

Sr.No. Metoda i opis
1

stats.isFile()

Zwraca wartość true, jeśli typ pliku jest plikiem prostym.

2

stats.isDirectory()

Zwraca prawdę, jeśli typ pliku katalogu.

3

stats.isBlockDevice()

Zwraca wartość true, jeśli typ pliku urządzenia blokowego.

4

stats.isCharacterDevice()

Zwraca wartość true, jeśli typ pliku urządzenia znakowego.

5

stats.isSymbolicLink()

Zwraca wartość true, jeśli typ pliku dowiązania symbolicznego.

6

stats.isFIFO()

Zwraca wartość true, jeśli typ pliku FIFO.

7

stats.isSocket()

Zwraca wartość true, jeśli typ pliku to asocket.

Przykład

Utwórzmy plik js o nazwie main.js z następującym kodem -

var fs = require("fs");

console.log("Going to get file info!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
      return console.error(err);
   }
   console.log(stats);
   console.log("Got file info successfully!");
   
   // Check file type
   console.log("isFile ? " + stats.isFile());
   console.log("isDirectory ? " + stats.isDirectory());    
});

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Going to get file info!
{ 
   dev: 1792,
   mode: 33188,
   nlink: 1,
   uid: 48,
   gid: 48,
   rdev: 0,
   blksize: 4096,
   ino: 4318127,
   size: 97,
   blocks: 8,
   atime: Sun Mar 22 2015 13:40:00 GMT-0500 (CDT),
   mtime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT),
   ctime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT) 
}
Got file info successfully!
isFile ? true
isDirectory ? false

Pisanie pliku

Składnia

Poniżej znajduje się składnia jednej z metod zapisu do pliku -

fs.writeFile(filename, data[, options], callback)

Ta metoda nadpisze plik, jeśli plik już istnieje. Jeśli chcesz pisać do istniejącego pliku, powinieneś użyć innej dostępnej metody.

Parametry

Oto opis użytych parametrów -

  • path - To jest ciąg zawierający nazwę pliku, w tym ścieżkę.

  • data - To jest łańcuch lub bufor do zapisania w pliku.

  • options- Trzeci parametr to obiekt, który będzie zawierał {kodowanie, tryb, flagę}. Domyślnie. kodowanie to utf8, tryb to wartość ósemkowa 0666. a flaga to „w”

  • callback - Jest to funkcja zwrotna, która pobiera pojedynczy parametr err, który zwraca błąd w przypadku jakiegokolwiek błędu zapisu.

Przykład

Utwórzmy plik js o nazwie main.js posiadające następujący kod -

var fs = require("fs");

console.log("Going to write into existing file");
fs.writeFile('input.txt', 'Simply Easy Learning!', function(err) {
   if (err) {
      return console.error(err);
   }
   
   console.log("Data written successfully!");
   console.log("Let's read newly written data");
   
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("Asynchronous read: " + data.toString());
   });
});

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Going to write into existing file
Data written successfully!
Let's read newly written data
Asynchronous read: Simply Easy Learning!

Czytanie pliku

Składnia

Poniżej znajduje się składnia jednej z metod odczytu z pliku -

fs.read(fd, buffer, offset, length, position, callback)

Ta metoda użyje deskryptora pliku do odczytania pliku. Jeśli chcesz odczytać plik bezpośrednio, używając nazwy pliku, powinieneś użyć innej dostępnej metody.

Parametry

Oto opis użytych parametrów -

  • fd - To jest deskryptor pliku zwracany przez fs.open ().

  • buffer - To jest bufor, w którym zostaną zapisane dane.

  • offset - To jest przesunięcie w buforze, od którego zaczyna się zapis.

  • length - Jest to liczba całkowita określająca liczbę bajtów do odczytania.

  • position- Jest to liczba całkowita określająca miejsce rozpoczęcia odczytu w pliku. Jeśli pozycja jest pusta, dane zostaną odczytane z bieżącej pozycji pliku.

  • callback - To jest funkcja zwrotna, która pobiera trzy argumenty (err, bytesRead, buffer).

Przykład

Utwórzmy plik js o nazwie main.js z następującym kodem -

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + " bytes read");
      
      // Print only read bytes to avoid junk.
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Going to open an existing file
File opened successfully!
Going to read the file
97 bytes read
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Zamykanie pliku

Składnia

Poniżej znajduje się składnia zamykania otwartego pliku -

fs.close(fd, callback)

Parametry

Oto opis użytych parametrów -

  • fd - To jest deskryptor pliku zwrócony przez metodę fs.open ().

  • callback - To jest funkcja zwrotna Do wywołania zwrotnego zakończenia nie są podawane inne argumenty niż możliwy wyjątek.

Example

Let us create a js file named main.js having the following code −

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) {
      if (err) {
         console.log(err);
      }

      // Print only read bytes to avoid junk.
      if(bytes > 0) {
         console.log(buf.slice(0, bytes).toString());
      }

      // Close the opened file.
      fs.close(fd, function(err) {
         if (err) {
            console.log(err);
         } 
         console.log("File closed successfully.");
      });
   });
});

Now run the main.js to see the result −

$ node main.js

Verify the Output.

Going to open an existing file
File opened successfully!
Going to read the file
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

File closed successfully.

Truncate a File

Syntax

Following is the syntax of the method to truncate an opened file −

fs.ftruncate(fd, len, callback)

Parameters

Here is the description of the parameters used −

  • fd − This is the file descriptor returned by fs.open().

  • len − This is the length of the file after which the file will be truncated.

  • callback − This is the callback function No arguments other than a possible exception are given to the completion callback.

Example

Let us create a js file named main.js having the following code −

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to truncate the file after 10 bytes");
   
   // Truncate the opened file.
   fs.ftruncate(fd, 10, function(err) {
      if (err) {
         console.log(err);
      } 
      console.log("File truncated successfully.");
      console.log("Going to read the same file"); 
      
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err) {
            console.log(err);
         }

         // Print only read bytes to avoid junk.
         if(bytes > 0) {
            console.log(buf.slice(0, bytes).toString());
         }

         // Close the opened file.
         fs.close(fd, function(err) {
            if (err) {
               console.log(err);
            } 
            console.log("File closed successfully.");
         });
      });
   });
});

Now run the main.js to see the result −

$ node main.js

Verify the Output.

Going to open an existing file
File opened successfully!
Going to truncate the file after 10 bytes
File truncated successfully.
Going to read the same file
Tutorials 
File closed successfully.

Delete a File

Syntax

Following is the syntax of the method to delete a file −

fs.unlink(path, callback)

Parameters

Here is the description of the parameters used −

  • path − This is the file name including path.

  • callback − This is the callback function No arguments other than a possible exception are given to the completion callback.

Example

Let us create a js file named main.js having the following code −

var fs = require("fs");

console.log("Going to delete an existing file");
fs.unlink('input.txt', function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("File deleted successfully!");
});

Now run the main.js to see the result −

$ node main.js

Verify the Output.

Going to delete an existing file
File deleted successfully!

Create a Directory

Syntax

Following is the syntax of the method to create a directory −

fs.mkdir(path[, mode], callback)

Parameters

Here is the description of the parameters used −

  • path − This is the directory name including path.

  • mode − This is the directory permission to be set. Defaults to 0777.

  • callback − This is the callback function No arguments other than a possible exception are given to the completion callback.

Example

Let us create a js file named main.js having the following code −

var fs = require("fs");

console.log("Going to create directory /tmp/test");
fs.mkdir('/tmp/test',function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("Directory created successfully!");
});

Now run the main.js to see the result −

$ node main.js

Verify the Output.

Going to create directory /tmp/test
Directory created successfully!

Read a Directory

Syntax

Following is the syntax of the method to read a directory −

fs.readdir(path, callback)

Parameters

Here is the description of the parameters used −

  • path − This is the directory name including path.

  • callback − This is the callback function which gets two arguments (err, files) where files is an array of the names of the files in the directory excluding '.' and '..'.

Example

Let us create a js file named main.js having the following code −

var fs = require("fs");

console.log("Going to read directory /tmp");
fs.readdir("/tmp/",function(err, files) {
   if (err) {
      return console.error(err);
   }
   files.forEach( function (file) {
      console.log( file );
   });
});

Now run the main.js to see the result −

$ node main.js

Verify the Output.

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test
test.txt

Remove a Directory

Syntax

Following is the syntax of the method to remove a directory −

fs.rmdir(path, callback)

Parameters

Here is the description of the parameters used −

  • path − This is the directory name including path.

  • callback − This is the callback function No arguments other than a possible exception are given to the completion callback.

Example

Let us create a js file named main.js having the following code −

var fs = require("fs");

console.log("Going to delete directory /tmp/test");
fs.rmdir("/tmp/test",function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("Going to read directory /tmp");
   
   fs.readdir("/tmp/",function(err, files) {
      if (err) {
         return console.error(err);
      }
      files.forEach( function (file) {
         console.log( file );
      });
   });
});

Now run the main.js to see the result −

$ node main.js

Verify the Output.

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test.txt

Methods Reference

Sr.No Method & Description
1

fs.rename(oldPath, newPath, callback)

Asynchronous rename(). No arguments other than a possible exception are given to the completion callback.

2

fs.ftruncate(fd, len, callback)

Asynchronous ftruncate(). No arguments other than a possible exception are given to the completion callback.

3

fs.ftruncateSync(fd, len)

Synchronous ftruncate().

4

fs.truncate(path, len, callback)

Asynchronous truncate(). No arguments other than a possible exception are given to the completion callback.

5

fs.truncateSync(path, len)

Synchronous truncate().

6

fs.chown(path, uid, gid, callback)

Asynchronous chown(). No arguments other than a possible exception are given to the completion callback.

7

fs.chownSync(path, uid, gid)

Synchronous chown().

8

fs.fchown(fd, uid, gid, callback)

Asynchronous fchown(). No arguments other than a possible exception are given to the completion callback.

9

fs.fchownSync(fd, uid, gid)

Synchronous fchown().

10

fs.lchown(path, uid, gid, callback)

Asynchronous lchown(). No arguments other than a possible exception are given to the completion callback.

11

fs.lchownSync(path, uid, gid)

Synchronous lchown().

12

fs.chmod(path, mode, callback)

Asynchronous chmod(). No arguments other than a possible exception are given to the completion callback.

13

fs.chmodSync(path, mode)

Synchronous chmod().

14

fs.fchmod(fd, mode, callback)

Asynchronous fchmod(). No arguments other than a possible exception are given to the completion callback.

15

fs.fchmodSync(fd, mode)

Synchronous fchmod().

16

fs.lchmod(path, mode, callback)

Asynchronous lchmod(). No arguments other than a possible exception are given to the completion callback. Only available on Mac OS X.

17

fs.lchmodSync(path, mode)

Synchronous lchmod().

18

fs.stat(path, callback)

Asynchronous stat(). The callback gets two arguments (err, stats) where stats is an fs.Stats object.

19

fs.lstat(path, callback)

Asynchronous lstat(). The callback gets two arguments (err, stats) where stats is an fs.Stats object. lstat() is identical to stat(), except that if path is a symbolic link, then the link itself is stat-ed, not the file that it refers to.

20

fs.fstat(fd, callback)

Asynchronous fstat(). The callback gets two arguments (err, stats) where stats is an fs.Stats object. fstat() is identical to stat(), except that the file to be stat-ed is specified by the file descriptor fd.

21

fs.statSync(path)

Synchronous stat(). Returns an instance of fs.Stats.

22

fs.lstatSync(path)

Synchronous lstat(). Returns an instance of fs.Stats.

23

fs.fstatSync(fd)

Synchronous fstat(). Returns an instance of fs.Stats.

24

fs.link(srcpath, dstpath, callback)

Asynchronous link(). No arguments other than a possible exception are given to the completion callback.

25

fs.linkSync(srcpath, dstpath)

Synchronous link().

26

fs.symlink(srcpath, dstpath[, type], callback)

Asynchronous symlink(). No arguments other than a possible exception are given to the completion callback. The type argument can be set to 'dir', 'file', or 'junction' (default is 'file') and is only available on Windows (ignored on other platforms). Note that Windows junction points require the destination path to be absolute. When using 'junction', the destination argument will automatically be normalized to absolute path.

27

fs.symlinkSync(srcpath, dstpath[, type])

Synchronous symlink().

28

fs.readlink(path, callback)

Asynchronous readlink(). The callback gets two arguments (err, linkString).

29

fs.realpath(path[, cache], callback)

Asynchronous realpath(). The callback gets two arguments (err, resolvedPath). May use process.cwd to resolve relative paths. cache is an object literal of mapped paths that can be used to force a specific path resolution or avoid additional fs.stat calls for known real paths.

30

fs.realpathSync(path[, cache])

Synchronous realpath(). Returns the resolved path.

31

fs.unlink(path, callback)

Asynchronous unlink(). No arguments other than a possible exception are given to the completion callback.

32

fs.unlinkSync(path)

Synchronous unlink().

33

fs.rmdir(path, callback)

Asynchronous rmdir(). No arguments other than a possible exception are given to the completion callback.

34

fs.rmdirSync(path)

Synchronous rmdir().

35

fs.mkdir(path[, mode], callback)

Asynchronous mkdir(2). No arguments other than a possible exception are given to the completion callback. mode defaults to 0777.

36

fs.mkdirSync(path[, mode])

Synchronous mkdir().

37

fs.readdir(path, callback)

Asynchronous readdir(3). Reads the contents of a directory. The callback gets two arguments (err, files) where files is an array of the names of the files in the directory excluding '.' and '..'.

38

fs.readdirSync(path)

Synchronous readdir(). Returns an array of filenames excluding '.' and '..'.

39

fs.close(fd, callback)

Asynchronous close(). No arguments other than a possible exception are given to the completion callback.

40

fs.closeSync(fd)

Synchronous close().

41

fs.open(path, flags[, mode], callback)

Asynchronous file open.

42

fs.openSync(path, flags[, mode])

Synchronous version of fs.open().

43

fs.utimes(path, atime, mtime, callback)

 

44

fs.utimesSync(path, atime, mtime)

Change file timestamps of the file referenced by the supplied path.

45

fs.futimes(fd, atime, mtime, callback)

 

46

fs.futimesSync(fd, atime, mtime)

Change the file timestamps of a file referenced by the supplied file descriptor.

47

fs.fsync(fd, callback)

Asynchronous fsync. No arguments other than a possible exception are given to the completion callback.

48

fs.fsyncSync(fd)

Synchronous fsync.

49

fs.write(fd, buffer, offset, length[, position], callback)

Write buffer to the file specified by fd.

50

fs.write(fd, data[, position[, encoding]], callback)

Write data to the file specified by fd. If data is not a Buffer instance then the value will be coerced to a string.

51

fs.writeSync(fd, buffer, offset, length[, position])

Synchronous versions of fs.write(). Returns the number of bytes written.

52

fs.writeSync(fd, data[, position[, encoding]])

Synchronous versions of fs.write(). Returns the number of bytes written.

53

fs.read(fd, buffer, offset, length, position, callback)

Read data from the file specified by fd.

54

fs.readSync(fd, buffer, offset, length, position)

Synchronous version of fs.read. Returns the number of bytesRead.

55

fs.readFile(filename[, options], callback)

Asynchronously reads the entire contents of a file.

56

fs.readFileSync(filename[, options])

Synchronous version of fs.readFile. Returns the contents of the filename.

57

fs.writeFile(filename, data[, options], callback)

Asynchronously writes data to a file, replacing the file if it already exists. data can be a string or a buffer.

58

fs.writeFileSync(filename, data[, options])

The synchronous version of fs.writeFile.

59

fs.appendFile(filename, data[, options], callback)

Asynchronously append data to a file, creating the file if it does not exist. data can be a string or a buffer.

60

fs.appendFileSync(filename, data[, options])

The synchronous version of fs.appendFile.

61

fs.watchFile(filename[, options], listener)

Watch for changes on filename. The callback listener will be called each time the file is accessed.

62

fs.unwatchFile(filename[, listener])

Stop watching for changes on filename. If listener is specified, only that particular listener is removed. Otherwise, all listeners are removed and you have effectively stopped watching filename.

63

fs.watch(filename[, options][, listener])

Watch for changes on filename, where filename is either a file or an directory. The returned object is an fs.FSWatcher.

64

fs.exists(path, callback)

Test whether or not the given path exists by checking with the file system. Then call the callback argument with either true or false.

65

fs.existsSync(path)

Synchronous version of fs.exists.

66

fs.access(path[, mode], callback)

Tests a user's permissions for the file specified by path. mode is an optional integer that specifies the accessibility checks to be performed.

67

fs.accessSync(path[, mode])

Synchronous version of fs.access. It throws if any accessibility checks fail, and does nothing otherwise.

68

fs.createReadStream(path[, options])

Returns a new ReadStream object.

69

fs.createWriteStream(path[, options])

Returns a new WriteStream object.

70

fs.symlink(srcpath, dstpath[, type], callback)

Asynchronous symlink(). No arguments other than a possible exception are given to the completion callback. The type argument can be set to 'dir', 'file', or 'junction' (default is 'file') and is only available on Windows (ignored on other platforms). Note that Windows junction points require the destination path to be absolute. When using 'junction', the destination argument will automatically be normalized to absolute path.

Obiekty globalne Node.js mają charakter globalny i są dostępne we wszystkich modułach. Nie musimy umieszczać tych obiektów w naszej aplikacji, możemy raczej z nich korzystać bezpośrednio. Te obiekty to moduły, funkcje, łańcuchy i sam obiekt, jak wyjaśniono poniżej.

__Nazwa pliku

Plik __filenamereprezentuje nazwę pliku wykonywanego kodu. To jest rozwiązana ścieżka bezwzględna tego pliku kodu. W przypadku programu głównego niekoniecznie jest to ta sama nazwa pliku, która została użyta w wierszu poleceń. Wartość wewnątrz modułu to ścieżka do tego pliku modułu.

Przykład

Utwórz plik js o nazwie main.js z następującym kodem -

// Let's try to print the value of __filename

console.log( __filename );

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Na podstawie lokalizacji twojego programu wydrukuje nazwę głównego pliku w następujący sposób -

/web/com/1427091028_21099/main.js

__dirname

Plik __dirname reprezentuje nazwę katalogu, w którym znajduje się aktualnie wykonywany skrypt.

Przykład

Utwórz plik js o nazwie main.js z następującym kodem -

// Let's try to print the value of __dirname

console.log( __dirname );

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Na podstawie lokalizacji twojego programu wydrukuje nazwę bieżącego katalogu w następujący sposób -

/web/com/1427091028_21099

setTimeout (cb, ms)

Plik setTimeout(cb, ms)Funkcja globalna służy do wywołania zwrotnego cb po co najmniej ms milisekundach. Rzeczywiste opóźnienie zależy od czynników zewnętrznych, takich jak szczegółowość timera systemu operacyjnego i obciążenie systemu. Czasomierz nie może trwać dłużej niż 24,8 dni.

Ta funkcja zwraca nieprzezroczystą wartość, która reprezentuje licznik czasu, którego można użyć do wyczyszczenia licznika czasu.

Przykład

Utwórz plik js o nazwie main.js z następującym kodem -

function printHello() {
   console.log( "Hello, World!");
}

// Now call above function after 2 seconds
setTimeout(printHello, 2000);

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź, czy dane wyjściowe są drukowane z niewielkim opóźnieniem.

Hello, World!

clearTimeout (t)

Plik clearTimeout(t)Funkcja global służy do zatrzymania licznika czasu, który został wcześniej utworzony za pomocą metody setTimeout (). Tutajt jest licznikiem czasu zwróconym przez funkcję setTimeout ().

Przykład

Utwórz plik js o nazwie main.js z następującym kodem -

function printHello() {
   console.log( "Hello, World!");
}

// Now call above function after 2 seconds
var t = setTimeout(printHello, 2000);

// Now clear the timer
clearTimeout(t);

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź wydruk, na którym nie znajdziesz niczego wydrukowanego.

setInterval (cb, ms)

Plik setInterval(cb, ms)Funkcja global służy do wielokrotnego uruchamiania wywołania zwrotnego cb po co najmniej ms milisekundach. Rzeczywiste opóźnienie zależy od czynników zewnętrznych, takich jak szczegółowość timera systemu operacyjnego i obciążenie systemu. Czasomierz nie może trwać dłużej niż 24,8 dni.

Ta funkcja zwraca nieprzezroczystą wartość, która reprezentuje licznik czasu, którego można użyć do wyczyszczenia licznika czasu za pomocą funkcji clearInterval(t).

Przykład

Utwórz plik js o nazwie main.js z następującym kodem -

function printHello() {
   console.log( "Hello, World!");
}

// Now call above function after 2 seconds
setInterval(printHello, 2000);

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Powyższy program będzie wykonywał printHello () co 2 sekundy. Z powodu ograniczeń systemu.

Obiekty globalne

Poniższa tabela zawiera listę innych obiektów, których często używamy w naszych aplikacjach. Aby uzyskać więcej informacji, możesz zapoznać się z oficjalną dokumentacją.

Sr.No. Nazwa i opis modułu
1 Console

Służy do drukowania informacji o stdout i stderr.

2 Process

Służy do uzyskiwania informacji o bieżącym procesie. Zapewnia wiele zdarzeń związanych z działaniami procesu.

W bibliotece modułów Node.js dostępnych jest kilka modułów narzędziowych. Te moduły są bardzo powszechne i często używane podczas tworzenia aplikacji opartych na Node.

Sr.No. Nazwa i opis modułu
1 Moduł systemu operacyjnego

Zapewnia podstawowe funkcje narzędziowe związane z systemem operacyjnym.

2 Moduł ścieżki

Udostępnia narzędzia do obsługi i przekształcania ścieżek plików.

3 Moduł sieciowy

Udostępnia serwery i klientów jako strumienie. Działa jako opakowanie sieciowe.

4 Moduł DNS

Udostępnia funkcje do rzeczywistego wyszukiwania DNS, a także do korzystania z podstawowych funkcji rozpoznawania nazw systemu operacyjnego.

5 Moduł domeny

Zapewnia sposoby obsługi wielu różnych operacji we / wy jako jednej grupy.

Co to jest serwer WWW?

Serwer sieci Web to aplikacja, która obsługuje żądania HTTP wysyłane przez klienta HTTP, podobnie jak przeglądarki internetowe, i zwraca strony internetowe w odpowiedzi do klientów. Serwery internetowe zwykle dostarczają dokumenty html wraz z obrazami, arkuszami stylów i skryptami.

Większość serwerów WWW obsługuje skrypty po stronie serwera, używając języków skryptowych lub przekierowując zadanie do serwera aplikacji, który pobiera dane z bazy danych i wykonuje złożoną logikę, a następnie wysyła wynik do klienta HTTP za pośrednictwem serwera WWW.

Serwer WWW Apache jest jednym z najczęściej używanych serwerów WWW. Jest to projekt open source.

Architektura aplikacji internetowych

Aplikacja internetowa jest zwykle podzielona na cztery warstwy -

  • Client - Ta warstwa składa się z przeglądarek internetowych, przeglądarek mobilnych lub aplikacji, które mogą wysyłać żądania HTTP do serwera internetowego.

  • Server - W tej warstwie znajduje się serwer WWW, który może przechwytywać żądania wysyłane przez klientów i przekazywać im odpowiedź.

  • Business- Ta warstwa zawiera serwer aplikacji, który jest używany przez serwer WWW do wykonania wymaganego przetwarzania. Ta warstwa współdziała z warstwą danych za pośrednictwem bazy danych lub niektórych programów zewnętrznych.

  • Data - Ta warstwa zawiera bazy danych lub inne źródła danych.

Tworzenie serwera WWW przy użyciu Node

Node.js udostępnia plik httpmoduł, za pomocą którego można stworzyć klienta HTTP serwera. Poniżej znajduje się minimalna struktura serwera HTTP, który nasłuchuje na porcie 8081.

Utwórz plik js o nazwie server.js -

File: server.js

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

// Create a server
http.createServer( function (request, response) {  
   // Parse the request containing file name
   var pathname = url.parse(request.url).pathname;
   
   // Print the name of the file for which request is made.
   console.log("Request for " + pathname + " received.");
   
   // Read the requested file content from file system
   fs.readFile(pathname.substr(1), function (err, data) {
      if (err) {
         console.log(err);
         
         // HTTP Status: 404 : NOT FOUND
         // Content Type: text/plain
         response.writeHead(404, {'Content-Type': 'text/html'});
      } else {	
         //Page found	  
         // HTTP Status: 200 : OK
         // Content Type: text/plain
         response.writeHead(200, {'Content-Type': 'text/html'});	
         
         // Write the content of the file to response body
         response.write(data.toString());		
      }
      
      // Send the response body 
      response.end();
   });   
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

Następnie utwórzmy następujący plik html o nazwie index.htm w tym samym katalogu, w którym utworzono plik server.js.

File: index.htm

<html>
   <head>
      <title>Sample Page</title>
   </head>
   
   <body>
      Hello World!
   </body>
</html>

Teraz uruchommy server.js, aby zobaczyć wynik -

$ node server.js

Sprawdź dane wyjściowe.

Server running at http://127.0.0.1:8081/

Wyślij żądanie do serwera Node.js.

Otwórz http://127.0.0.1:8081/index.htm w dowolnej przeglądarce, aby zobaczyć następujący wynik.

Sprawdź dane wyjściowe na końcu serwera.

Server running at http://127.0.0.1:8081/
Request for /index.htm received.

Tworzenie klienta WWW przy użyciu Node

Klienta internetowego można utworzyć za pomocą httpmoduł. Sprawdźmy następujący przykład.

Utwórz plik js o nazwie client.js -

File: client.js

var http = require('http');

// Options to be used by request 
var options = {
   host: 'localhost',
   port: '8081',
   path: '/index.htm'  
};

// Callback function is used to deal with response
var callback = function(response) {
   // Continuously update stream with data
   var body = '';
   response.on('data', function(data) {
      body += data;
   });
   
   response.on('end', function() {
      // Data received completely.
      console.log(body);
   });
}
// Make a request to the server
var req = http.request(options, callback);
req.end();

Teraz uruchom plik client.js z innego terminala poleceń innego niż server.js, aby zobaczyć wynik -

$ node client.js

Sprawdź dane wyjściowe.

<html>
   <head>
      <title>Sample Page</title>
   </head>
   
   <body>
      Hello World!
   </body>
</html>

Sprawdź dane wyjściowe na końcu serwera.

Server running at http://127.0.0.1:8081/
Request for /index.htm received.

Express Overview

Express to minimalna i elastyczna struktura aplikacji internetowych Node.js, która zapewnia solidny zestaw funkcji do tworzenia aplikacji internetowych i mobilnych. Ułatwia szybki rozwój aplikacji internetowych opartych na węzłach. Oto niektóre z podstawowych funkcji frameworka Express -

  • Umożliwia skonfigurowanie oprogramowania pośredniczącego w celu odpowiadania na żądania HTTP.

  • Definiuje tablicę routingu używaną do wykonywania różnych działań na podstawie metody HTTP i adresu URL.

  • Umożliwia dynamiczne renderowanie stron HTML na podstawie przekazywania argumentów do szablonów.

Instalowanie Express

Po pierwsze, zainstaluj platformę Express globalnie za pomocą NPM, aby można było jej użyć do stworzenia aplikacji internetowej przy użyciu terminala węzłowego.

$ npm install express --save

Powyższe polecenie zapisuje instalację lokalnie w node_moduleskatalog i tworzy katalog express wewnątrz node_modules. Powinieneś zainstalować następujące ważne moduły wraz z ekspresowym -

  • body-parser - To jest oprogramowanie pośredniczące node.js do obsługi danych formularza w formacie JSON, Raw, Text i URL.

  • cookie-parser - Przeanalizuj nagłówek Cookie i wypełnij req.cookies obiektem z kluczem według nazw plików cookie.

  • multer - To jest oprogramowanie pośredniczące node.js do obsługi danych wieloczęściowych / formularzy.

$ npm install body-parser --save
$ npm install cookie-parser --save $ npm install multer --save

Witaj świecie Przykład

Poniżej znajduje się bardzo podstawowa aplikacja Express, która uruchamia serwer i nasłuchuje na porcie 8081 pod kątem połączenia. Ta aplikacja odpowiadaHello World!w przypadku zapytań do strony głównej. W przypadku każdej innej ścieżki odpowie rozszerzeniem404 Not Found.

var express = require('express');
var app = express();

app.get('/', function (req, res) {
   res.send('Hello World');
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Zapisz powyższy kod w pliku o nazwie server.js i uruchom go następującym poleceniem.

$ node server.js

Zobaczysz następujący wynik -

Example app listening at http://0.0.0.0:8081

Otwórz http://127.0.0.1:8081/ w dowolnej przeglądarce, aby zobaczyć następujący wynik.

Wymagać odpowiedzi

Aplikacja Express używa funkcji zwrotnej, której parametry to request i response obiekty.

app.get('/', function (req, res) {
   // --
})
  • Obiekt żądania - obiekt żądania reprezentuje żądanie HTTP i ma właściwości ciągu zapytania żądania, parametrów, treści, nagłówków HTTP i tak dalej.

  • Obiekt odpowiedzi - obiekt odpowiedzi reprezentuje odpowiedź HTTP, którą aplikacja Express wysyła po otrzymaniu żądania HTTP.

Możesz drukować req i res obiekty, które dostarczają wielu informacji związanych z żądaniem i odpowiedzią HTTP, w tym pliki cookie, sesje, adres URL itp.

Podstawowy routing

Widzieliśmy podstawową aplikację, która obsługuje żądanie HTTP dla strony głównej. Routing odnosi się do określenia, w jaki sposób aplikacja odpowiada na żądanie klienta skierowane do określonego punktu końcowego, którym jest identyfikator URI (lub ścieżka) oraz określona metoda żądania HTTP (GET, POST itd.).

Rozszerzymy nasz program Hello World, aby obsługiwał więcej typów żądań HTTP.

var express = require('express');
var app = express();

// This responds with "Hello World" on the homepage
app.get('/', function (req, res) {
   console.log("Got a GET request for the homepage");
   res.send('Hello GET');
})

// This responds a POST request for the homepage
app.post('/', function (req, res) {
   console.log("Got a POST request for the homepage");
   res.send('Hello POST');
})

// This responds a DELETE request for the /del_user page.
app.delete('/del_user', function (req, res) {
   console.log("Got a DELETE request for /del_user");
   res.send('Hello DELETE');
})

// This responds a GET request for the /list_user page.
app.get('/list_user', function (req, res) {
   console.log("Got a GET request for /list_user");
   res.send('Page Listing');
})

// This responds a GET request for abcd, abxcd, ab123cd, and so on
app.get('/ab*cd', function(req, res) {   
   console.log("Got a GET request for /ab*cd");
   res.send('Page Pattern Match');
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Zapisz powyższy kod w pliku o nazwie server.js i uruchom go następującym poleceniem.

$ node server.js

Zobaczysz następujący wynik -

Example app listening at http://0.0.0.0:8081

Teraz możesz wypróbować różne żądania pod adresem http://127.0.0.1:8081, aby zobaczyć dane wyjściowe wygenerowane przez server.js. Poniżej znajduje się kilka zrzutów ekranu pokazujących różne odpowiedzi na różne adresy URL.

Ekran pokazuje ponownie http://127.0.0.1:8081/list_user

Ekran pokazuje ponownie http://127.0.0.1:8081/abcd

Ekran pokazuje ponownie http://127.0.0.1:8081/abcdefg

Udostępnianie plików statycznych

Express zapewnia wbudowane oprogramowanie pośredniczące express.static do obsługi plików statycznych, takich jak obrazy, CSS, JavaScript itp.

Wystarczy przekazać nazwę katalogu, w którym przechowujesz zasoby statyczne, do pliku express.staticoprogramowanie pośredniczące, aby rozpocząć bezpośrednie udostępnianie plików. Na przykład, jeśli przechowujesz swoje obrazy, pliki CSS i JavaScript w katalogu o nazwie public, możesz to zrobić -

app.use(express.static('public'));

Zatrzymamy kilka zdjęć w formacie public/images podkatalog w następujący sposób -

node_modules
server.js
public/
public/images
public/images/logo.png

Zmodyfikujmy aplikację „Hello Word”, aby dodać funkcję obsługi plików statycznych.

var express = require('express');
var app = express();

app.use(express.static('public'));

app.get('/', function (req, res) {
   res.send('Hello World');
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port

   console.log("Example app listening at http://%s:%s", host, port)
})

Zapisz powyższy kod w pliku o nazwie server.js i uruchom go następującym poleceniem.

$ node server.js

Teraz otwórz http://127.0.0.1:8081/images/logo.png w dowolnej przeglądarce i zobacz następujący wynik.

POBIERZ metodę

Oto prosty przykład, który przekazuje dwie wartości za pomocą metody HTML FORM GET. Będziemy używaćprocess_get router wewnątrz server.js do obsługi tego wejścia.

<html>
   <body>
      
      <form action = "http://127.0.0.1:8081/process_get" method = "GET">
         First Name: <input type = "text" name = "first_name">  <br>
         Last Name: <input type = "text" name = "last_name">
         <input type = "submit" value = "Submit">
      </form>
      
   </body>
</html>

Zapiszmy powyższy kod w index.htm i zmodyfikujmy server.js, aby obsługiwał żądania strony głównej, a także dane wejściowe wysyłane przez formularz HTML.

var express = require('express');
var app = express();

app.use(express.static('public'));
app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})

app.get('/process_get', function (req, res) {
   // Prepare output in JSON format
   response = {
      first_name:req.query.first_name,
      last_name:req.query.last_name
   };
   console.log(response);
   res.end(JSON.stringify(response));
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Dostęp do dokumentu HTML za pomocą http://127.0.0.1:8081/index.htm wygeneruje następujący formularz -

Teraz możesz wpisać imię i nazwisko, a następnie kliknąć przycisk przesyłania, aby zobaczyć wynik, który powinien zwrócić następujący wynik -

{"first_name":"John","last_name":"Paul"}

Metoda POST

Oto prosty przykład, który przekazuje dwie wartości za pomocą metody HTML FORM POST. Będziemy używaćprocess_get router wewnątrz server.js do obsługi tego wejścia.

<html>
   <body>
      
      <form action = "http://127.0.0.1:8081/process_post" method = "POST">
         First Name: <input type = "text" name = "first_name"> <br>
         Last Name: <input type = "text" name = "last_name">
         <input type = "submit" value = "Submit">
      </form>
      
   </body>
</html>

Zapiszmy powyższy kod w index.htm i zmodyfikujmy server.js, aby obsługiwał żądania strony głównej, a także dane wejściowe wysyłane przez formularz HTML.

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

// Create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

app.use(express.static('public'));
app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})

app.post('/process_post', urlencodedParser, function (req, res) {
   // Prepare output in JSON format
   response = {
      first_name:req.body.first_name,
      last_name:req.body.last_name
   };
   console.log(response);
   res.end(JSON.stringify(response));
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Dostęp do dokumentu HTML za pomocą http://127.0.0.1:8081/index.htm wygeneruje następujący formularz -

Teraz możesz wpisać imię i nazwisko, a następnie kliknąć przycisk przesyłania, aby zobaczyć następujący wynik -

{"first_name":"John","last_name":"Paul"}

Udostępnianie pliku

Poniższy kod HTML tworzy formularz do przesyłania plików. Ten formularz ma atrybut metody ustawiony naPOST a atrybut enctype jest ustawiony na multipart/form-data

<html>
   <head>
      <title>File Uploading Form</title>
   </head>

   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      
      <form action = "http://127.0.0.1:8081/file_upload" method = "POST" 
         enctype = "multipart/form-data">
         <input type="file" name="file" size="50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
      
   </body>
</html>

Zapiszmy powyższy kod w index.htm i zmodyfikujmy server.js, aby obsługiwał żądania strony głównej, a także przesyłanie plików.

var express = require('express');
var app = express();
var fs = require("fs");

var bodyParser = require('body-parser');
var multer  = require('multer');

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}));

app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})

app.post('/file_upload', function (req, res) {
   console.log(req.files.file.name);
   console.log(req.files.file.path);
   console.log(req.files.file.type);
   var file = __dirname + "/" + req.files.file.name;
   
   fs.readFile( req.files.file.path, function (err, data) {
      fs.writeFile(file, data, function (err) {
         if( err ) {
            console.log( err );
            } else {
               response = {
                  message:'File uploaded successfully',
                  filename:req.files.file.name
               };
            }
         
         console.log( response );
         res.end( JSON.stringify( response ) );
      });
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Dostęp do dokumentu HTML za pomocą http://127.0.0.1:8081/index.htm wygeneruje następujący formularz -

File Upload:
Select a file to upload: 

NOTE: This is just dummy form and would not work, but it must work at your server.

Zarządzanie plikami cookies

Możesz wysłać pliki cookie do serwera Node.js, który może obsłużyć to samo, przy użyciu następującej opcji oprogramowania pośredniego. Poniżej znajduje się prosty przykład drukowania wszystkich plików cookie wysłanych przez klienta.

var express      = require('express')
var cookieParser = require('cookie-parser')

var app = express()
app.use(cookieParser())

app.get('/', function(req, res) {
   console.log("Cookies: ", req.cookies)
})
app.listen(8081)

Co to jest architektura REST?

REST oznacza REpresentational State Transfer. REST to architektura oparta na standardach internetowych i wykorzystuje protokół HTTP. Obraca się wokół zasobu, w którym każdy komponent jest zasobem, a dostęp do zasobu uzyskuje się przez wspólny interfejs przy użyciu standardowych metod HTTP. REST został po raz pierwszy wprowadzony przez Roya Fieldinga w 2000 roku.

Serwer REST po prostu zapewnia dostęp do zasobów, a klient REST uzyskuje dostęp i modyfikuje zasoby za pomocą protokołu HTTP. Tutaj każdy zasób jest identyfikowany za pomocą identyfikatorów URI / identyfikatorów globalnych. REST używa różnych reprezentacji do reprezentowania zasobów, takich jak tekst, JSON, XML, ale JSON jest najpopularniejszym.

Metody HTTP

Następujące cztery metody HTTP są powszechnie używane w architekturze opartej na REST.

  • GET - Służy do zapewnienia dostępu tylko do odczytu do zasobu.

  • PUT - Służy do tworzenia nowego zasobu.

  • DELETE - Służy do usuwania zasobu.

  • POST - Służy do aktualizacji istniejącego zasobu lub tworzenia nowego zasobu.

Usługi sieciowe RESTful

Usługa internetowa to zbiór otwartych protokołów i standardów używanych do wymiany danych między aplikacjami lub systemami. Aplikacje napisane w różnych językach programowania i działające na różnych platformach mogą wykorzystywać usługi sieciowe do wymiany danych w sieciach komputerowych, takich jak Internet, w sposób podobny do komunikacji między procesami na jednym komputerze. Ta interoperacyjność (np. Komunikacja między aplikacjami Java i Python lub Windows i Linux) wynika z wykorzystania otwartych standardów.

Usługi sieciowe oparte na architekturze REST są znane jako usługi sieciowe RESTful. Te usługi sieciowe wykorzystują metody HTTP do implementacji koncepcji architektury REST. Usługa sieciowa zgodna ze specyfikacją REST zwykle definiuje identyfikator URI, Uniform Resource Identifier, usługę, która zapewnia reprezentację zasobów, taką jak JSON i zestaw metod HTTP.

Tworzenie RESTful dla biblioteki

Rozważmy, że mamy bazę danych użytkowników opartą na formacie JSON, która zawiera następujących użytkowników w pliku users.json:

{
   "user1" : {
      "name" : "mahesh",
      "password" : "password1",
      "profession" : "teacher",
      "id": 1
   },
   
   "user2" : {
      "name" : "suresh",
      "password" : "password2",
      "profession" : "librarian",
      "id": 2
   },
   
   "user3" : {
      "name" : "ramesh",
      "password" : "password3",
      "profession" : "clerk",
      "id": 3
   }
}

Na podstawie tych informacji udostępnimy następujące interfejsy API RESTful.

Sr.No. URI Metoda HTTP POST body Wynik
1 listUsers DOSTAĆ pusty Pokaż listę wszystkich użytkowników.
2 Dodaj użytkownika POCZTA Ciąg JSON Dodaj szczegóły nowego użytkownika.
3 Usuń użytkownika USUNĄĆ Ciąg JSON Usuń istniejącego użytkownika.
4 :ID DOSTAĆ pusty Pokaż szczegóły użytkownika.

Zachowuję większość wszystkich przykładów w formie twardego kodowania, zakładając, że wiesz już, jak przekazywać wartości z interfejsu użytkownika za pomocą Ajax lub prostych danych formularza i jak je przetwarzać za pomocą wyrażenia Request obiekt.

Lista użytkowników

Zaimplementujmy nasze pierwsze RESTful API listUsers używając następującego kodu w pliku server.js -

server.js

var express = require('express');
var app = express();
var fs = require("fs");

app.get('/listUsers', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      console.log( data );
      res.end( data );
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Teraz spróbuj uzyskać dostęp do zdefiniowanego API, używając adresu URL: http://127.0.0.1:8081/listUsers i metody HTTP: POBIERZ na komputer lokalny przy użyciu dowolnego klienta REST. Powinno to dać następujący wynik -

Możesz zmienić podany adres IP, gdy umieścisz rozwiązanie w środowisku produkcyjnym.

{
   "user1" : {
      "name" : "mahesh",
      "password" : "password1",
      "profession" : "teacher",
      "id": 1
   },
   
   "user2" : {
      "name" : "suresh",
      "password" : "password2",
      "profession" : "librarian",
      "id": 2
   },
   
   "user3" : {
      "name" : "ramesh",
      "password" : "password3",
      "profession" : "clerk",
      "id": 3
   }
}

Dodaj użytkownika

Poniższy interfejs API pokaże Ci, jak dodać nowego użytkownika do listy. Poniżej znajdują się szczegóły nowego użytkownika -

user = {
   "user4" : {
      "name" : "mohit",
      "password" : "password4",
      "profession" : "teacher",
      "id": 4
   }
}

Możesz zaakceptować te same dane wejściowe w postaci JSON za pomocą wywołania Ajax, ale z punktu widzenia nauczania, robimy to na sztywno tutaj. Poniżej znajduje sięaddUser API dla nowego użytkownika w bazie danych -

server.js

var express = require('express');
var app = express();
var fs = require("fs");

var user = {
   "user4" : {
      "name" : "mohit",
      "password" : "password4",
      "profession" : "teacher",
      "id": 4
   }
}

app.post('/addUser', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      data["user4"] = user["user4"];
      console.log( data );
      res.end( JSON.stringify(data));
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Teraz spróbuj uzyskać dostęp do zdefiniowanego API, używając adresu URL: http://127.0.0.1:8081/addUser i metody HTTP: POST na komputerze lokalnym przy użyciu dowolnego klienta REST. Powinno to dać następujący wynik -

{
   "user1":{"name":"mahesh","password":"password1","profession":"teacher","id":1},
   "user2":{"name":"suresh","password":"password2","profession":"librarian","id":2},
   "user3":{"name":"ramesh","password":"password3","profession":"clerk","id":3},
   "user4":{"name":"mohit","password":"password4","profession":"teacher","id":4}
}

Pokaż szczegół

Teraz zaimplementujemy API, które zostanie wywołane za pomocą identyfikatora użytkownika i wyświetli szczegóły odpowiedniego użytkownika.

server.js

var express = require('express');
var app = express();
var fs = require("fs");

app.get('/:id', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      var users = JSON.parse( data );
      var user = users["user" + req.params.id] 
      console.log( user );
      res.end( JSON.stringify(user));
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Teraz spróbuj uzyskać dostęp do zdefiniowanego API za pomocą adresu URL: http://127.0.0.1:8081/2 i metody HTTP: POBIERZ na komputer lokalny przy użyciu dowolnego klienta REST. Powinno to dać następujący wynik -

{"name":"suresh","password":"password2","profession":"librarian","id":2}

Usuń użytkownika

To API jest bardzo podobne do addUser API, w którym otrzymujemy dane wejściowe przez req.body, a następnie na podstawie identyfikatora użytkownika usuwamy tego użytkownika z bazy danych. Aby nasz program był prosty, zakładamy, że usuniemy użytkownika o identyfikatorze 2.

server.js

var express = require('express');
var app = express();
var fs = require("fs");

var id = 2;

app.delete('/deleteUser', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      delete data["user" + 2];
       
      console.log( data );
      res.end( JSON.stringify(data));
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Teraz spróbuj uzyskać dostęp do zdefiniowanego API, używając adresu URL: http://127.0.0.1:8081/deleteUser i metody HTTP: DELETE na komputerze lokalnym przy użyciu dowolnego klienta REST. Powinno to dać następujący wynik -

{"user1":{"name":"mahesh","password":"password1","profession":"teacher","id":1},
"user3":{"name":"ramesh","password":"password3","profession":"clerk","id":3}}

Node.js działa w trybie jednowątkowym, ale używa paradygmatu sterowanego zdarzeniami do obsługi współbieżności. Ułatwia również tworzenie procesów potomnych w celu wykorzystania przetwarzania równoległego w systemach z wielordzeniowymi procesorami.

Procesy potomne zawsze mają trzy strumienie child.stdin, child.stdout, i child.stderr które mogą być współdzielone ze strumieniami stdio procesu nadrzędnego.

Node zapewnia child_process moduł, który ma następujące trzy główne sposoby tworzenia procesu potomnego.

  • exec - metoda child_process.exec uruchamia polecenie w powłoce / konsoli i buforuje dane wyjściowe.

  • spawn - child_process.spawn uruchamia nowy proces z podanym poleceniem.

  • fork - Metoda child_process.fork jest specjalnym przypadkiem metody spawn () do tworzenia procesów potomnych.

Metoda exec ()

child_process.exec uruchamia polecenie w powłoce i buforuje dane wyjściowe. Ma następujący podpis -

child_process.exec(command[, options], callback)

Parametry

Oto opis użytych parametrów -

  • command (String) Polecenie do uruchomienia z argumentami oddzielonymi spacjami

  • options (Obiekt) może obejmować jedną lub więcej z następujących opcji -

    • cwd (String) Bieżący katalog roboczy procesu potomnego

    • env (Obiekt) Pary klucz-wartość środowiska

    • encoding (Ciąg) (domyślnie: „utf8”)

    • shell (Ciąg) Powłoka do wykonania polecenia z (Domyślnie: „/ bin / sh” w systemie UNIX, „cmd.exe” w systemie Windows) Powłoka powinna rozumieć przełącznik -c w systemie UNIX lub / s / c w systemie Windows. W systemie Windows, parsowanie wiersza poleceń powinno być zgodne z cmd.exe).

    • timeout (Liczba) (domyślnie: 0)

    • maxBuffer (Liczba) (domyślnie: 200 * 1024)

    • killSignal (Ciąg) (Domyślnie: „SIGTERM”)

    • uid (Liczba) Ustawia tożsamość użytkownika procesu.

    • gid (Liczba) Ustawia tożsamość grupy procesu.

  • callback Funkcja pobiera trzy argumenty error, stdout, i stderr które są wywoływane wraz z wyjściem po zakończeniu procesu.

Metoda exec () zwraca bufor o maksymalnym rozmiarze i czeka na zakończenie procesu i próbuje jednocześnie zwrócić wszystkie zbuforowane dane.

Przykład

Utwórzmy dwa pliki js o nazwach support.js i master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,function 
      (error, stdout, stderr) {
      
      if (error) {
         console.log(error.stack);
         console.log('Error code: '+error.code);
         console.log('Signal received: '+error.signal);
      }
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
   });

   workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

Teraz uruchom plik master.js, aby zobaczyć wynik -

$ node master.js

Sprawdź dane wyjściowe. Serwer został uruchomiony.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

Metoda spawn ()

child_process.spawn uruchamia nowy proces z podanym poleceniem. Ma następujący podpis -

child_process.spawn(command[, args][, options])

Parametry

Oto opis użytych parametrów -

  • command (String) Polecenie do uruchomienia

  • args (Tablica) Lista argumentów łańcuchowych

  • options (Obiekt) może obejmować jedną lub więcej z następujących opcji -

    • cwd (String) Bieżący katalog roboczy procesu potomnego.

    • env (Obiekt) Pary klucz-wartość środowiska.

    • stdio (Array) String Konfiguracja stdio dziecka.

    • customFds (Tablica) Przestarzałe Deskryptory plików, których dziecko ma używać w stdio.

    • detached (Boolean) Dziecko będzie liderem grupy procesów.

    • uid (Liczba) Ustawia tożsamość użytkownika procesu.

    • gid (Liczba) Ustawia tożsamość grupy procesu.

Metoda spawn () zwraca strumienie (stdout & stderr) i powinna być używana, gdy proces zwraca objętość danych. spawn () zaczyna otrzymywać odpowiedź zaraz po rozpoczęciu wykonywania procesu.

Przykład

Utwórz dwa pliki js o nazwach support.js i master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i = 0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Teraz uruchom plik master.js, aby zobaczyć wynik -

$ node master.js

Sprawdź dane wyjściowe. Serwer został uruchomiony

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

Metoda fork ()

metoda child_process.fork to specjalny przypadek funkcji spawn () do tworzenia procesów węzła. Ma następujący podpis -

child_process.fork(modulePath[, args][, options])

Parametry

Oto opis użytych parametrów -

  • modulePath (String) Moduł do uruchomienia w elemencie potomnym.

  • args (Tablica) Lista argumentów łańcuchowych

  • options (Obiekt) może obejmować jedną lub więcej z następujących opcji -

    • cwd (String) Bieżący katalog roboczy procesu potomnego.

    • env (Obiekt) Pary klucz-wartość środowiska.

    • execPath (String) Plik wykonywalny używany do tworzenia procesu potomnego.

    • execArgv (Tablica) Lista argumentów łańcuchowych przekazanych do pliku wykonywalnego (domyślnie: process.execArgv).

    • silent (Boolean) Jeśli true, stdin, stdout i stderr dziecka zostaną przesłane potokiem do rodzica, w przeciwnym razie zostaną odziedziczone po rodzicu, zobacz opcje "pipe" i "inherit" dla stdio spawn (), aby uzyskać więcej informacji szczegóły (wartość domyślna to fałsz).

    • uid (Liczba) Ustawia tożsamość użytkownika procesu.

    • gid (Liczba) Ustawia tożsamość grupy procesu.

Metoda fork zwraca obiekt z wbudowanym kanałem komunikacyjnym oprócz wszystkich metod w normalnej instancji ChildProcess.

Przykład

Utwórz dwa pliki js o nazwach support.js i master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Teraz uruchom plik master.js, aby zobaczyć wynik -

$ node master.js

Sprawdź dane wyjściowe. Serwer został uruchomiony.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0

JXcore, który jest projektem open source, wprowadza unikalną funkcję pakowania i szyfrowania plików źródłowych i innych zasobów do pakietów JX.

Weź pod uwagę, że masz duży projekt składający się z wielu plików. JXcore może spakować je wszystkie w jeden plik, aby uprościć dystrybucję. Ten rozdział zawiera krótkie omówienie całego procesu, począwszy od instalacji JXcore.

Instalacja JXcore

Instalacja JXcore jest dość prosta. Podaliśmy tutaj instrukcje krok po kroku, jak zainstalować JXcore w systemie. Wykonaj czynności podane poniżej -

Krok 1

Pobierz pakiet JXcore z https://github.com/jxcore/jxcore, zgodnie z systemem operacyjnym i architekturą maszyny. Pobraliśmy pakiet dla Cenots działającego na komputerze 64-bitowym.

$ wget https://s3.amazonaws.com/nodejx/jx_rh64.zip

Krok 2

Rozpakuj pobrany plik jx_rh64.zipi skopiuj plik binarny jx do / usr / bin lub może znajdować się w dowolnym innym katalogu w zależności od konfiguracji systemu.

$ unzip jx_rh64.zip
$ cp jx_rh64/jx /usr/bin

Krok 3

Ustaw odpowiednio zmienną PATH, aby uruchamiać jx z dowolnego miejsca.

$ export PATH=$PATH:/usr/bin

Krok 4

Możesz zweryfikować swoją instalację, wydając proste polecenie, jak pokazano poniżej. Powinieneś znaleźć to działające i wydrukować jego numer wersji w następujący sposób -

$ jx --version
v0.10.32

Pakowanie kodu

Rozważ, że masz projekt z następującymi katalogami, w których trzymałeś wszystkie swoje pliki, w tym Node.js, plik główny, index.js i wszystkie moduły zainstalowane lokalnie.

drwxr-xr-x  2 root root  4096 Nov 13 12:42 images
-rwxr-xr-x  1 root root 30457 Mar  6 12:19 index.htm
-rwxr-xr-x  1 root root 30452 Mar  1 12:54 index.js
drwxr-xr-x 23 root root  4096 Jan 15 03:48 node_modules
drwxr-xr-x  2 root root  4096 Mar 21 06:10 scripts
drwxr-xr-x  2 root root  4096 Feb 15 11:56 style

Aby spakować powyższy projekt, wystarczy wejść do tego katalogu i wydać następujące polecenie jx. Zakładając, że index.js jest plikiem wejściowym dla twojego projektu Node.js -

$ jx package index.js index

Tutaj można było użyć dowolnej innej nazwy pakietu zamiast index. Użyliśmy indexponieważ chcieliśmy zachować naszą główną nazwę pliku jako index.jx. Jednak powyższe polecenie spakuje wszystko i utworzy następujące dwa pliki -

  • index.jxp Jest to plik pośredni zawierający wszystkie szczegóły projektu potrzebne do skompilowania projektu.

  • index.jx Jest to plik binarny zawierający kompletny pakiet, który jest gotowy do wysłania do klienta lub do środowiska produkcyjnego.

Uruchamianie pliku JX

Rozważmy, że oryginalny projekt Node.js działał w następujący sposób -

$ node index.js command_line_arguments

Po skompilowaniu pakietu przy użyciu JXcore można go uruchomić w następujący sposób -

$ jx index.jx command_line_arguments

Aby dowiedzieć się więcej na temat JXcore, możesz sprawdzić jego oficjalną stronę.