Node.js'e başlamayı zorlaştırabilecek olay-yönelimli programlama yeni başlayanlar için zor olabilir. Ama sakın vazgeçmeyin; bu makalede, Node.js'in temellerinden birkaçını gösterecek ve neden bu kadar ünlü olduğunu açıklayacağım.
GirişNode.js kullanmaya başlamak için, ilk önce Node.js ile geleneksel sunucu-taraflı kodlama ortamı (örn. PHP, Python, Ruby, vesaire) arasındaki farkları anlamalısınız.
Eşzamansız Programlama
Alıntı:Node.js karmaşık uygulama yaratımlarını kolaylaştırmak için bir modül mimarisi kullanır.
Eşzamansız programlamaya aşinalık çok iyi olacaktır, herşeyden önce Ajax'deki "A" odur (İngilizce sözcükle). Node.js'deki her fonksiyon eşzamansızdır. Bu yüzden, normal şartlarda program işleyişini kilitleyecek herşey, arka planda çalıştırılır. Node.js ile ilgili unutulmaması gereken en önemli şey budur. Örneğin, dosya sistemi üzerindeki bir dosyayı okuyorsanız, okuma işlemi tamamlandığında çalıştırılacak bir geriçağrı fonskiyonu belirtmek zorundasınız.
Herşeyi Yapıyorsunuz!Node.js yalnızca bir ortamdır - anlamı herşeyi kendiniz yapmanız gerekiyor. Varsayılan bir HTTP sunucusu yoktur, yada bu bağlamda herhangi bir sunucu. Yeni kullanıcılar için bu biraz yıldırıcı olabilir, ama karşılığı yüksek performanslı bir web uygulamasıdır. Bir kod istemcilerle olan tüm iletişimi halleder. Bu da uygulama tarafından kullanılan kaynak sayısını kayda değer şekilde düşürür. Örneğin, işte basit bir Node.js uygulamasının kodu:
1var i, a, b, c, max;
2
3max = 1000000000;
4
5var d = Date.now();
6
7for (i = 0; i < max; i++) {
8 a = 1234 + 5678 + i;
9 b = 1234 * 5678 + i;
10 c = 1234 / 2 + i;
11}
12
13console.log(Date.now() - d);
Ve işte PHP'deki karşılığı:
1$a = null;
2$b = null;
3$c = null;
4$i = null;
5$max = 1000000000;
6
7$start = microtime(true);
8
9for ($i = 0; $i < $max; $i++) {
10 $a = 1234 + 5678 + $i;
11 $b = 1234 * 5678 + $i;
12 $c = 1234 / 2 + $i;
13}
14
15var_dump(microtime(true) - $start);
Şimdi kıyaslama sayılarına bakalım. Aşağıdaki tablo bu iki basit uygulamanın yanıt sürelerini, milisaniye olarak listeler:
Tekrarlama sayısıNode.jsPHP1002.000.1410'0003.0010.531'000'00015.001119.2410'000'000143.0010621.461'000'000'00011118.001036272.19İki uygulamayı da sunucunun uygulamaların derlenmesini geciktirmemesi için komut satırından çalıştırdım. Her testi on kez çalıştırdım ve ortalama sonuçlara ulaştım. PHP az sayıdaki tekrarlamalarda bariz şekilde hızlı, ama bu avantaj tekrarlama sayısı arttıkça çabucak eriyip gidiyor. Herşey bittiğinde, PHP Node.js'ten 93% daha yavaş!
Node.js hızlıdır, ama onu gerektiği gibi kullanmak için birkaç şeyi öğrenmeniz gerekecek.
ModüllerNode.js karmaşık uygulamaların yaratımını kolaylaştırmak için bir modül mimarisi kullanır. Modüller, C'deki kütüphanelere, ya da Pascal'daki birimlere benzerler. Her modül modülün "konusuyla" ilgili bir dizi fonksiyon içerir. Örneğin,
http modülü HTTP'ye özel fonksiyonları içerir. Node.js dosya sistemindeki dosyalara erişim, HTTP ve TCP/UDP sunucuları yaratma ve diğer kullanışlı işlevleri gerçekleştirmenize yardımcı olacak birkaç ana sıradışı modül sunar.
Bir modülü içermek kolaydır; sadece
fonksiyonunu çağırın, şunun gibi:
1var http = require('http');
Alıntı:Node.js yalnızca bir ortamdır; herşeyi kendiniz yapmalısınız.
fonksiyonu belirtilen modüle başvuru döndürür. Bu kodun özelinde, bir
http modül başvurusu
değişkeninde saklanır.
Yukarıdaki kodda, bir modül ismini
fonksiyonuna geçtik. Bu Node'un uygulama dizininizde node_modules'ü, ve o dizinde http modülünü aramasına neden olur. Node
node_modules dizinini bulamazda (ya da içinde
http modülünü), o zaman global modül önbelleğini tarar. Gerçek bir dosyayı, göreceli ya da kesin yolu geçirerek de belirtebilirsiniz, şunun gibi:
1var myModule = require('./myModule.js');
Modüller kod bölümlerini içerir. Bir modül içindeki kod genellikle özeldir - yani içlerinde tanımlandıkları fonksiyonlar ve değişkenler yalnızca modül içinden erişilebilirdir. Bununla birlikte,modül dışında kullanılması için fonksiyon ve/veya değişkenleri açığa çıkartabilirsiniz. Bunun için,
nesnesini kullanın ve onun özelliklerini ve yöntemlerini açığa çıkartmak istediğiniz kod bölümleriyle doldurun. Aşağıdaki modülü bir örnek olarak düşünün:
1var PI = Math.PI;
2
3exports.area = function ® {
4 return PI * r * r;
5};
6
7exports.circumference = function ® {
8 return 2 * PI * r;
9};
Bu kod yalnızca modül içinde yer alan kod tarafından erişilebilen bir
değişkeni yaratır; modül dışında erişilebilir değildir. Sonra,
nesnesi üzerinde iki fonksiyon yaratılır. Bu fonksiyonlar modül dışında erişilebilirdirler çünkü
nesnesi üzerinde tanımlıdırlar. Sonuç olarak,
tamamen dış müdahaleye karşı korumalıdır. Bu yüzden,
ve
yöntemlerinin daima olması gerektiği gibi davranacağından emin olabilirsiniz (
parametresi için bir değer sağlandığı sürece).
Global KapsamNode Google'ın V8 JavaScript moturunda çalışan bir JavaScript ortamıdır. Bundan dolayı, istemci-taraflı geliştirme için kullandığımız en iyi pratikleri takip etmeliyiz. Örneğin, herhangi birşeyi global kapsama koymaktan kaçınmalıyız. Ki, yine de, her zaman mümkün değildir. Node'da global kapsam
'dir(gözatıcıdaki
'un tersine), ve
sözcüğünü altayarak kolayca global bir değişken fonksiyonu yaratabilirsiniz:
1globalVariable = 1;
2globalFunction = function () { ... };
Bir kez daha söylemek gerekirse, globallerden mümkün olduğunca kaçınılmalıdır. Bu yüzden dikkatli olmalı ve bir değişken tanımında
kullanılmalıdır.
KurulumDoğaldır ki, bir uygulama yazıp çalıştırmadan önce Node'u yüklememiz gerekir. Kurulum çok basittir, Windows ya da OS X kullanıyorsanız;
nodejs.org websitesi bu işletim sistemlerinin kurucularını sağlar. Linux'ta, herhangi bir paket yöneticisini kullanın. Terminalinizi açın ve şunu yazın:
1sudo apt-get update
2sudo apt-get install node
ya da:
1sudo aptitude update
2sudo aptitude install node
Node.js sid depolarındadır; kaynakları listenize eklemeniz gerekebilir:
1sudo echo deb
http://ftp.us.debian.org/debian/ sid main > /etc/apt/sources.list.d/sid.list
Ama eski sistemlerde sid paketlerinin kurulmasının sisteminizi bozabileceği aklınızda olsun. Dikkatli olun, ve Node'un kurulumu bittikten sonra
Kod:
/etc/apt/sources.list.d/sid.list
'i kaldırın.
Yeni Modüllerin KurulmasıNode.js'nin Node Package Manager (NPM-Node Paket Yöneticisi) bir paket yöneticisi vardır. Node.js ile birlikte kendiliğinden kurulur, ve yeni modülleri kurmak için NPM'yi kullanırsınız. Bir modülü kurmak için, terminalinizi/komut satırını açın, istenilen dizine gidin, ve aşağıdaki komutu çalıştırın.
1npm install module_name
Hangi işletim sisteminizin olduğu önemli değildir; yukarıdaki komut
module_name'in yerine belirttiğiniz modülü kuracaktır
Hello World UygulamasıPek tabii ki, ilk Node.js kodumuz konsola
metnini yazdıracak. Bunun için
hello.js adında bir dosya yaratın, ve aşağıdaki kodu girin:
1console.log('Hello World!');
Şimdi kodu çalıştıralım. Terminalinizi/komut satırını açın,
hello.js'yi içeren dizini gezin, ve aşağıdaki komutu derleyin:
1node hello.js
Konsolda görüntülenen
ü görmeniz gerekiyor.
HTTP SunucuHaydi daha gelişmiş bir uygulamaya geçelim; merak etmeyin sandığınız kadar karmaşık değil. Aşağıdaki kodla başlayalım. Düşülen notları ve ardından aşağıdaki açıklamayı okuyun.
1// Include http module.
2var http = require("http");
3
4// Create the server. Function passed as parameter is called on every request made.
5// request variable holds all request parameters
6// response variable allows you to do anything with response sent to the client.
7http.createServer(function (request, response) {
8 // Attach listener on end event.
9 // This event is called when client sent all data and is waiting for response.
10 request.on("end", function () {
11 // Write headers to the response.
12 // 200 is HTTP status code (this one means success)
13 // Second parameter holds header fields in object
14 // We are sending plain text, so Content-Type should be text/plain
15 response.writeHead(200, {
16 'Content-Type': 'text/plain'
17 });
18 // Send data and end response.
19 response.end('Hello HTTP!');
20 });
21// Listen on the 8080 port.
22}).listen(8080);
Bu kod çok basit.
metodunu kullanarak istemciye daha fazla veri gönderebilirsiniz, ama bunu
'i çağırmadan önce yapmalısınız. Bu kodu
http.js olarak kaydedin ve şunu konsolunuza yazın:
1node http.js
Gözatıcınızı açın ve
Kod:
http://localhost:8080
adresini girin. Sayfada "Hello HTTP!" metnini görmelisiniz.
URL Parametrelerinin İşlenmesiDaha önce bahsettiğim gibi, Node'da herşeyi kendimiz yapmamız gerekiyor, istek argümanlarının ayıklanması da dahil. Bu, yine de, oldukça basit. Aşağıdaki koda bir göz atın:
1// Include http module,
2var http = require("http"),
3// And url module, which is very helpful in parsing request parameters.
4 url = require("url");
5
6// Create the server.
7http.createServer(function (request, response) {
8 // Attach listener on end event.
9 request.on('end', function () {
10 // Parse the request for arguments and store them in _get variable.
11 // This function parses the url from request and returns object representation.
12 var _get = url.parse(request.url, true).query;
13 // Write headers to the response.
14 response.writeHead(200, {
15 'Content-Type': 'text/plain'
16 });
17 // Send data and end response.
18 response.end('Here is your data: ' + _get['data']);
19 });
20// Listen on the 8080 port.
21}).listen(8080);
Bu kod ana bir Node.js modülünü, isteğin URL'sini bir nesneye çevirmek için,
url modülünün
yöntemini kullanır, Döndürülen nesnenin URL'nin parametrelerinin alan bir
özelliği vardır. Bu dosyayı
get.js olarak kaydedin ve aşağıdaki komutla çalıştırın:
1node get.js
Ardından gözatıcınızla
Kod:
http://localhost:8080/?data=put_some_text_here
adresine gidin. Doğaldır ki,
parametresinin değerinin değiştirilmesi kodu bozmayacaktır.
Dosyaları Okuma ve YazmaNode'da dosyaları yönetmek için,
fs modülünü (ana bir modül) kullanıyoruz. Dosyaları okumak ve yazmak için, sırasıyla
ve
yöntemlerini kullanıyoruz. Aşağıdaki koddan sonra argümanları açıklayacağım:
1// Include http module,
2var http = require("http"),
3// And mysql module you've just installed.
4 fs = require("fs");
5
6// Create the http server.
7http.createServer(function (request, response) {
8 // Attach listener on end event.
9 request.on("end", function () {
10 // Read the file.
11 fs.readFile("test.txt", 'utf-8', function (error, data) {
12 // Write headers.
13 response.writeHead(200, {
14 'Content-Type': 'text/plain'
15 });
16 // Increment the number obtained from file.
17 data = parseInt(data) + 1;
18 // Write incremented number to file.
19 fs.writeFile('test.txt', data);
20 // End response with some nice message.
21 response.end('This page was yenileed ' + data + ' times!');
22 });
23 });
24// Listen on the 8080 port.
25}).listen(8080);
Alıntı:Node.js'in Node Package Manager (NPM-Node Paket Yöneticisi) adında bir paket yöneticisi vardır. Node.js ile kendiliğinden yüklenir.
Bunu
files.js olarak kaydedin. Bu kodu çalıştırmadan önce,
files.js ile aynı dizinde
test.txt adlı bir dosya yaratın.
Bu kod
ve
yöntemlerini gösterir. Sunucu her istek aldığında, kod dosyadan sayıyı okur, arttırır ve yeni sayıyı dosyaya yazar.
yöntemi üç argüman kabul eder: okunacak dosya adı, beklenen karakter kodu, ve geriçağrı fonksiyonu.
Dosyaya yazma, en azından bu durumda, çok daha basittir. Herhangi bir sonucu beklememiz gerekmiyor, gerçek bir uygulamada hata kontrolü yapmamız gerekse de.
yöntemi dosya adı ve veriyi argüman olarak kabul eder. Ayrıca sırasıyla karakter kodu ve geriçağrı fonksiyonunu belirtmek için üçüncü ve dördüncü argümanları da kabul eder( ikisi de tercihe bağlıdır).
Şimdi, aşağıdaki komutla kodu çalıştıralım:
1node files.js
Gözatıcıda (
Kod:
http://localhost:8080
) açın ve birkaç kez yenileyin. Şimdi, iki arttırdığı görüldüğünden kodda hata olduğunu düşünebilirsiniz. Bu bir hata değildir. Bu URL'yi her istediğinizde, iki istek sunucuya gönderilir. İlk istek
favicon.ico'yu isteyen gözatıcı tarafından kendiliğinden yapılır, ve tabii ki, ikincisi de URL içindir (
Kod:
http://localhost:8080
).
Bu davranış teknik olarak bir hata değilse de, istemediğimiz bir davranıştır. Bunu istek URL'yi kontrol ederek kolayca düzeltebiliriz. İşte yenilenmiş kod:
1// Include http module,
2var http = require("http"),
3// And mysql module you've just installed.
4 fs = require("fs");
5
6// Create the http server.
7http.createServer(function (request, response) {
8 // Attach listener on end event.
9 request.on('end', function () {
10 // Check if user requests /
11 if (request.url == '/') {
12 // Read the file.
13 fs.readFile('test.txt', 'utf-8', function (error, data) {
14 // Write headers.
15 response.writeHead(200, {
16 'Content-Type': 'text/plain'
17 });
18 // Increment the number obtained from file.
19 data = parseInt(data) + 1;
20 // Write incremented number to file.
21 fs.writeFile('test.txt', data);
22 // End response with some nice message.
23 response.end('This page was yenileed ' + data + ' times!');
24 });
25 } else {
26 // Indicate that requested file was not found.
27 response.writeHead(404);
28 // And end request without sending any data.
29 response.end();
30 }
31 });
32// Listen on the 8080 port.
33}).listen(8080);
Artık test edin, beklendiği gibi çalışacaktır.
MySQL Veritabanlarına ErişimÇoğu sunucu-taraflı teknolojilerin bir veritabanına bağlanmak ve veritabanını sorgulamak için dahili araçları vardır. Node.js ile, bir kütüphane kurmak zorundasınız. Bu makale için, yapısı değişmeyecek ve kullanımı kolay
node-mysql'i seçtim. Bu modülün tam adı
[email protected] (@'den sonraki herşey sürüm numarası). Konsolunuzu açın, kodlarınızı sakladığınız dizine gidin, ve aşağıdaki komutu çalıştırın:
1npm install
[email protected] Bu modülü yükler ve kurar, ve ayrıca geçerli dizinde
node_modules dizini yaratır. Şimdi bunu kodumuzda nasıl kullanacağımıza bakalım; aşağıdaki örneğe bakalım:
1// Include http module,
2var http = require('http'),
3// And mysql module you've just installed.
4 mysql = require("mysql");
5
6// Create the connection.
7// Data is default to new mysql installation and should be changed according to your configuration.
8var connection = mysql.createConnection({
9 user: "root",
10 password: "",
11 database: "db_name"
12});
13
14// Create the http server.
15http.createServer(function (request, response) {
16 // Attach listener on end event.
17 request.on('end', function () {
18 // Query the database.
19 connection.query('SELECT * FROM your_table;', function (error, rows, fields) {
20 response.writeHead(200, {
21 'Content-Type': 'x-application/json'
22 });
23 // Send data as JSON string.
24 // Rows variable holds the result of the query.
25 response.end(JSON.stringify(rows));
26 });
27 });
28// Listen on the 8080 port.
29}).listen(8080);
Bu kütüphaneyle veritabanı sorgulaması kolaydır; basitçe sorgu metni ve geriçağrı fonksiyonunu girin. Gerçek bir uygulamada,hata olup olmadığını kontrol etmeniz (hata olursa
parametresi
olmayacaktır) ve sorgunun başarılı yada başarısızlığına bağlı olarak yanıt kodları yollamanız gerek.
'ı JSON için geçerli MIME tipi olan
verdiğimize de dikkat edin.
parametresi sorgunun sonucunu içerir; ve
içindeki veriyi
yöntemini kullanarak kolayca JSON biçimine dönüştürüyoruz.
Bu dosyayı
mysql.js olarak kaydedin, ve onu çalıştırın (kurulu MySQL'iniz varsa yani):
1node mysql.js
Gözatıcınızda
Kod:
http://localhost:8080
adresine gidin, ve JSON-biçimli dosyayı yüklemeye yönlendirilmeniz gerekiyor.
Sonuç
Alıntı:Node.js'deki her fonksiyon eşzamansızdır.
Node.js fazladan iş demektir, ama hızlı ve sağlam bir uygulamanın bedeli olmaya değerdir. Şayet herşeyi en alt düzeyde yapmak istemiyorsanız, her zaman
Express gibi, uygulama geliştirmeyi kolaylaştıran bir çatı seçebilirsiniz.
Node.js umut vaad eden bir teknolojidir ve çok yüklü bir uygulama için mükemmel bir seçimdir. Microsoft, eBay, ve Yahoo gibi firmalarca kanıtlanmıştır. Şayet websitenizi/uygulamanızı yayınlama konusunda emin değilseniz, her zaman ucuz bir VPS çözümü ya da Microsoft Azure ve Amazon EC2 gibi çeşitli bulut-tabanlı hizmetlerini kullanabilirsiniz. Bu hizmetlerin her ikisi de makul bir fiyata ölçeklenebilir ortamlar sunar.
Herhangi bir sorunuzda, not düşmeyi unutmayın!