Node.js® Hakkında
Asenkron olaya dayalı bir JavaScript çalıştırma ortamı olarak, Node.js, ölçeklenebilir ağ uygulamaları oluşturmak için tasarlanmıştır. Aşağıdaki "merhaba dünya" örneğinde, birçok bağlantı aynı anda işlenebilir. Her bağlantıda geri çağrı tetiklenir, ancak yapılacak iş yoksa, Node.js uyur.
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}/`);
});
Bu, bugünün daha yaygın olan eş zamanlılık modeline karşı bir durumdur, bu modelde işletim sistemi iş parçacıkları kullanılır. İş parçacığı tabanlı ağ iletişimi nispeten verimsizdir ve çok zor kullanılır. Ayrıca, Node.js kullanıcıları, kilitlenme endişelerinden bağımsızdır, çünkü kilitler yoktur. Node.js'deki neredeyse hiçbir işlev doğrudan G/Ç yapmaz, bu nedenle işlem, Node.js standart kitaplığının senkron yöntemleri kullanılarak G/Ç gerçekleştirildiğinde dışında asla bloke olmaz. Hiçbir şey bloke olmadığı için, ölçeklenebilir sistemlerin Node.js'te geliştirilmesi çok mantıklıdır.
Eğer burada kullanılan bazı terimler sana yabancı geliyorsa, Engelleyici (Blocking) ve Engelleyici Olmayan (Non-Blocking) kavramlarını detaylıca anlatan bir makaleye göz atabilirsiniz.
Node.js, tasarım olarak Ruby’nin Event Machine ve Python’un Twisted sistemlerine benzer ve bu sistemlerden etkilenmiştir. Ancak Node.js, olay (event) modelini biraz daha ileriye taşır. Olay döngüsünü (event loop) bir kütüphane yerine çalışma zamanı (runtime) yapısı olarak sunar. Diğer sistemlerde ise olay döngüsünü başlatmak için mutlaka engelleyici (blocking) bir çağrı yapılır. Genellikle bir betiğin (script) başında geri çağırma fonksiyonları (callback) tanımlanır, sonunda ise EventMachine::run() gibi engelleyici bir çağrı ile sunucu başlatılır. Node.js’te ise böyle bir olay döngüsünü başlatan çağrı yoktur. Node.js, betiği çalıştırdıktan sonra doğrudan olay döngüsüne girer. Yürütülecek başka geri çağırma fonksiyonu kalmadığında ise olay döngüsünden çıkar. Bu davranış, tarayıcıdaki JavaScript’e benzer; olay döngüsü kullanıcıdan gizlenmiştir.
HTTP, Node.js'de birinci sınıf bir vatandaştır ve akış ve düşük gecikme düşünülerek tasarlanmıştır. Bu, Node.js'in bir web kitaplığının veya çerçevesinin temeli için uygun olmasını sağlar.
Node.js’in iş parçacıkları (thread) olmadan tasarlanmış olması, bulunduğunuz ortamda birden fazla çekirdeğin avantajlarından yararlanamayacağınız anlamına gelmez. child_process.fork()
API'sini kullanarak alt işlemler (child process) oluşturabilir ve bu işlemlerle kolayca iletişim kurabilirsiniz. Aynı yapı üzerine inşa edilmiş olan cluster
modülü ise, işlemler arasında socket paylaşımı yaparak çekirdekler arasında yük dengelemesi (load balancing) sağlamanıza imkân tanır.
Resmi Node.js Kaynakları
Node.js ile çalışırken özgünlük ve güvenliği sağlamak için her zaman resmi kaynakları kullanın. Resmi olmayan kaynaklardan gelen e-postalara, ikili dosyalara veya indirmelere güvenmeyin.
Resmi Node.js Alan Adları
Node.js ikili dosyalarını indirmek ve resmi dokümantasyona erişmek için yalnızca bu alan adlarını kullanın:
- nodejs.org
- nodejs.dev (https://nodejs.org adresine yönlendirilir)
- iojs.org (https://nodejs.org adresine yönlendirilir)
Resmi npm Paketleri
Node.js ekibi aşağıdaki resmi npm paket kapsamlarını yönetmektedir:
Ayrıca, Node.js ekibi nodejs-foundation
npm hesabı üzerinden yayınlanan paketleri yönetmektedir. Ancak, undici
gibi diğer Node.js ile ilgili paketler de projeyle yakından bağlantılı katkıda bulunanlar tarafından yönetiliyor olabilir.
Node.js ekibinden gelen paketleri kullanmak, resmi olarak desteklenen Node.js bileşenleriyle çalıştığınızın garantisidir.
Resmi GitHub Organizasyonları
Node.js ve ilgili projeler, aşağıdaki resmi GitHub organizasyonları altında yönetilmektedir:
Resmi İletişim Kanalları
Node.js ve OpenJS Vakfı, çeşitli resmi ve topluluk destekli kanallar aracılığıyla iletişim kurar. Katılım yollarıyla ilgili detaylara Katılın sayfasından ulaşabilirsiniz.
Web Sitesi Sorunları & Kesintilerini Bildirme
Node.js web sitesinde sorunla karşılaşırsanız, bunları Node.js web sitesi deposunda bildirin.
Kesintilerle ilgili anlık güncellemeler için Node.js Durum Sayfasını ziyaret edin.