Despre Node.js®
Fiind un mediu de execuție JavaScript asincron și bazat pe evenimente, Node.js este conceput pentru a crea aplicații de rețea scalabile. În exemplul „hello world” de mai jos, multe conexiuni pot fi gestionate simultan. La fiecare conexiune, este declanșat un apel-invers, iar dacă nu există sarcini de procesat, Node.js intră într-o stare de așteptare.
const { function createServer<Request extends typeof IncomingMessage = typeof IncomingMessage, Response extends typeof ServerResponse = typeof ServerResponse>(requestListener?: RequestListener<Request, Response>): Server<Request, Response> (+1 overload)
Returns a new instance of
{@link
Server
}
.
The `requestListener` is a function which is automatically
added to the `'request'` event.
```js
import http from 'node:http';
// Create a local server to receive data from
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
```
```js
import http from 'node:http';
// Create a local server to receive data from
const server = http.createServer();
// Listen to the request event
server.on('request', (request, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
```createServer } = var require: NodeJS.Require
(id: string) => any
Used to import modules, `JSON`, and local files.require('node:http');
const const hostname: "127.0.0.1"
hostname = '127.0.0.1';
const const port: 3000
port = 3000;
const const server: Server<typeof IncomingMessage, typeof ServerResponse>
server = createServer<typeof IncomingMessage, typeof ServerResponse>(requestListener?: RequestListener<typeof IncomingMessage, typeof ServerResponse> | undefined): Server<...> (+1 overload)
Returns a new instance of
{@link
Server
}
.
The `requestListener` is a function which is automatically
added to the `'request'` event.
```js
import http from 'node:http';
// Create a local server to receive data from
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
```
```js
import http from 'node:http';
// Create a local server to receive data from
const server = http.createServer();
// Listen to the request event
server.on('request', (request, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
```createServer((req: IncomingMessage
req, res: ServerResponse<IncomingMessage> & {
req: IncomingMessage;
}
res) => {
res: ServerResponse<IncomingMessage> & {
req: IncomingMessage;
}
res.ServerResponse<Request extends IncomingMessage = IncomingMessage>.statusCode: number
When using implicit headers (not calling `response.writeHead()` explicitly),
this property controls the status code that will be sent to the client when
the headers get flushed.
```js
response.statusCode = 404;
```
After response header was sent to the client, this property indicates the
status code which was sent out.statusCode = 200;
res: ServerResponse<IncomingMessage> & {
req: IncomingMessage;
}
res.OutgoingMessage<IncomingMessage>.setHeader(name: string, value: number | string | readonly string[]): ServerResponse<IncomingMessage> & {
req: IncomingMessage;
}
Sets a single header value. If the header already exists in the to-be-sent
headers, its value will be replaced. Use an array of strings to send multiple
headers with the same name.setHeader('Content-Type', 'text/plain');
res: ServerResponse<IncomingMessage> & {
req: IncomingMessage;
}
res.Stream.Writable.end(chunk: any, cb?: () => void): ServerResponse<IncomingMessage> & {
req: IncomingMessage;
} (+2 overloads)
Calling the `writable.end()` method signals that no more data will be written
to the `Writable`. The optional `chunk` and `encoding` arguments allow one
final additional chunk of data to be written immediately before closing the
stream.
Calling the
{@link
write
}
method after calling
{@link
end
}
will raise an error.
```js
// Write 'hello, ' and then end with 'world!'.
import fs from 'node:fs';
const file = fs.createWriteStream('example.txt');
file.write('hello, ');
file.end('world!');
// Writing more now is not allowed!
```end('Hello World');
});
const server: Server<typeof IncomingMessage, typeof ServerResponse>
server.Server.listen(port?: number, hostname?: string, listeningListener?: () => void): Server<typeof IncomingMessage, typeof ServerResponse> (+8 overloads)
Start a server listening for connections. A `net.Server` can be a TCP or
an `IPC` server depending on what it listens to.
Possible signatures:
* `server.listen(handle[, backlog][, callback])`
* `server.listen(options[, callback])`
* `server.listen(path[, backlog][, callback])` for `IPC` servers
* `server.listen([port[, host[, backlog]]][, callback])` for TCP servers
This function is asynchronous. When the server starts listening, the `'listening'` event will be emitted. The last parameter `callback`will be added as a listener for the `'listening'`
event.
All `listen()` methods can take a `backlog` parameter to specify the maximum
length of the queue of pending connections. The actual length will be determined
by the OS through sysctl settings such as `tcp_max_syn_backlog` and `somaxconn` on Linux. The default value of this parameter is 511 (not 512).
All
{@link
Socket
}
are set to `SO_REUSEADDR` (see [`socket(7)`](https://man7.org/linux/man-pages/man7/socket.7.html) for
details).
The `server.listen()` method can be called again if and only if there was an
error during the first `server.listen()` call or `server.close()` has been
called. Otherwise, an `ERR_SERVER_ALREADY_LISTEN` error will be thrown.
One of the most common errors raised when listening is `EADDRINUSE`.
This happens when another server is already listening on the requested`port`/`path`/`handle`. One way to handle this would be to retry
after a certain amount of time:
```js
server.on('error', (e) => {
if (e.code === 'EADDRINUSE') {
console.error('Address in use, retrying...');
setTimeout(() => {
server.close();
server.listen(PORT, HOST);
}, 1000);
}
});
```listen(const port: 3000
port, const hostname: "127.0.0.1"
hostname, () => {
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```console.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.log(`Server running at http://${const hostname: "127.0.0.1"
hostname}:${const port: 3000
port}/`);
});
Această abordare diferă de modelul de concurență mai comun din zilele noastre, care utilizează fire de execuție (threads) ale sistemului de operare. Rețelele bazate pe fire de execuție sunt relativ ineficiente și dificile de gestionat. În plus, utilizatorii Node.js nu trebuie să își facă griji cu privire la blocarea procesului, deoarece nu există mecanisme de blocare. Aproape nicio funcție din Node.js nu efectuează direct operații de I/O, astfel încât procesul nu se blochează decât dacă se folosesc metode sincrone din biblioteca standard Node.js. Datorită acestui comportament, dezvoltarea sistemelor scalabile în Node.js este foarte fezabilă.
Dacă unele dintre terminologii nu vă sunt familiare, există un articol complet despre Blocant vs Non-Blocant.
Node.js are un design similar și este influențat de sisteme precum Event Machine din Ruby și Twisted din Python. Totuși, Node.js duce modelul bazat pe evenimente un pas mai departe, prezentând event loop-ul ca o componentă a mediului de execuție, nu ca pe o bibliotecă externă. În alte sisteme, există întotdeauna un apel blocant pentru a porni event loop-ul. De obicei, comportamentul este definit prin callback-uri la începutul unui script, iar la final serverul este pornit printr-un apel blocant, precum EventMachine::run(). În Node.js, nu există un apel explicit pentru a porni event loop-ul. Node.js intră automat în event loop după ce execută scriptul primit ca intrare și iese din event loop atunci când nu mai există callback-uri de procesat. Acest comportament este similar cu cel din JavaScript-ul din browser, unde event loop-ul este ascuns de utilizator.
HTTP este un cetățean de primă clasă în Node.js, fiind proiectat având în vedere streaming-ul și latența redusă. Acest lucru face din Node.js o bază ideală pentru crearea de biblioteci sau framework-uri web.
Faptul că Node.js este conceput fără fire de execuție (threads) nu înseamnă că nu poți valorifica mai multe nuclee ale procesorului din mediul tău. Poți crea procese copil folosind API-ul child_process.fork()
și comunica ușor cu acestea. Pe baza aceleiași interfețe, modulul cluster
permite partajarea socket-urilor între procese, oferind posibilitatea de a distribui sarcina între nucleele tale.
Resursele oficiale Node.js
Pentru a asigura autenticitatea și securitatea atunci când lucrezi cu Node.js, folosește întotdeauna surse oficiale. Evită să ai încredere în emailuri, fișiere binare sau descărcări din surse neoficiale.
Domeniile oficiale Node.js
Pentru descărcarea fișierelor binare Node.js și accesarea documentației oficiale, folosește doar aceste domenii:
- nodejs.org
- nodejs.dev (redirecționează către https://nodejs.org)
- iojs.org (redirecționează către https://nodejs.org)
Pachetele oficiale npm
Echipa Node.js întreține următoarele domenii oficiale pentru pachetele npm:
De asemenea, echipa Node.js întreține pachetele publicate de contul npm nodejs-foundation
, însă și alte pachete legate de Node.js (cum ar fi undici
) pot fi întreținute de contributori strâns implicați în proiect.
Utilizarea pachetelor de la echipa Node.js garantează că lucrezi cu componente Node.js acceptate oficial.
Organizațiile oficiale GitHub
Node.js și proiectele conexe sunt întreținute sub aceste organizații oficiale GitHub:
Canalele oficiale de comunicare
Node.js și Fundația OpenJS comunică prin diverse canale oficiale și susținute de comunitate. Poți găsi detalii despre cum să te implici pe pagina Implică-te.
Raportarea problemelor și întreruperilor site-ului web
Dacă întâmpini probleme cu site-ul web Node.js, raportează-le în repozitoriul site-ului web Node.js. Pentru actualizări în timp real despre întreruperi, vizitează pagina de stare Node.js.