Node.js Nedir?
Selamlar Arkadaşlar;
Bugün node.js üzerine biraz konuşacağız. Javascript ile server side uygulamalar yazabileceğimiz, Joyent tarafından 2009 yılında geliştirilmeye başlanmış bir Javascript Runtime platformudur. V8 denilen javascript motoru üzerinde çalışır. V8 Google tarafından geliştirilen, Chrome web browserlarının da üzerinde çalıştığı C, C++ ve javascript dilleri ile kodlanan bir enginedir. Tek amacı javascript kodunu makine koduna çevirmektir. Kesinlikle çok performanslıdır. Asenkron olarak çalışan çoklu eventler yaratıp bizzat test ettim. Response hızları inanılmazdı. I/O ve network işlemlerini non-blocking olarak çalıştıran node.js, zaman ve kaynak konusunda çok cimri. Yani örnek verilmek istenir ise çok yüksek trafikli sitelerde anlık işlemler, kullanıcı sorgulamadan aynı signalR’da olduğu gibi web socket kullanılarak client’ın ekranına çok kısa zamanda ve az kaynak tüketilerek gönderilebilir. Mesela bir servisten çekilen borsa bilgilerinin tüm clientlara gönderilmesi gibi. Bu işlemi kullanıcı sorgulamadan borsa bilgileri değiştikçe yapılacaktır. Gerçek zamanlı (real time) uygulamalar web soket teknolojisi kullanılarak node.js ile performanslı bir şekilde yapılabilir.
Şimdi biraz da dünyadan örnekler verelim. Node.js’e geçen popüler firmalardan biri Linkedin’dir. Mobil sunucu tarafında Node.js ’e geçmeden önce Rails kullanıyordu. Node.js ’e geçtikten sonra server maliyeti 1/10 düşmüştür. Bazı işlemlerde 20 kata varan hız artışı olmuştır. Bence en güzel örnek Paypall. Hem de daha yakın tarihli. Paypall çalışma paltformunu riske etmemek için, direkt Node.js’e geçişi yerine Java ve Node.js olarak 2 plaftormda paralel olarak geliştirme yapmıştır. Sonuçta Node.js java uygulamasına göre 2 kat daha fazla saniyelik istemi karşılamıştır. Üstelik Node.js tek çekirdekli bir işlemci üzerinden çalışırken java uygulaması beş çekirdekli işlemci üzerinde çalışmaktadır. Yani Node.js maliyeti 1/5’e indirmiştir. Ayrıca response time’ı %35 hızlanmıştır.
Node.js’i https://nodejs.org/ ‘dan aşağıdaki gibi kolaylıkla indirilebilir.
Uygulamanın kurulduğu yere ‘node’ yazıp enter’a basılarak, javascript kodunun server-side olarak yazılabilecek platforma kavuşulmuş olunur. Örneğin ben aşağıda console’a yazı yazdırdım.
Şimdi gelelim ilk örneğimize: Aşağıda görüldüğü gibi bir http server oluşturulur. 2 parametre alır(req: request ve res: response). response ile sayfanın header’ının content-type‘ı “text/plain” ve içine yazılacak yazı belirlenir. req.url‘e göre yazılacak yazı koşula konur. Koşuldan kasıt Url’deki req.url‘e göre sayfaya basılan yazı değiştirilir. listen ile server’ın çalışacağı port ve local Ip belirlenir. Console log’a server’ın başladığı yazılır. İlgili kod NodeTest.js adında bir dosyanın içine konup kaydedilir.
D:\nodejs\NodeTest.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var http = require('http'); var server=http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); if(req.url=='/'){ res.write('Canakkaleye Hosgeldiniz.'); res.end(); }else if(req.url=='/bora'){ res.write('Bora Canakkaleye Hosgeldin.'); res.end(); }else if(req.url=='/asker'){ res.write('Canakkale Gecilmez Silahini Birakmayan Asker'); res.end(); }else { res.write('Page not found'); res.end(); } }); server.on('listening',function(){ console.log('ok, server is running'); }); server.listen(1915, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1915/'); |
1 |
node D:\NodeTest.js |
Aşağıdaki gibi node.js’i yüklediğimiz yerde node <ilgili javascript(.js) dosyası> çağrılır.
Ekran çıktıları:
Böylece IIS olmadan ilk sayfamızı yayımladık. Şimdi gelelim npm konusuna. Bu konu ile ilgili makaleye buradan ulaşabilirsiniz. Aynı nuget’de olduğu gibi node.js’de npm ile istenilen paketi indirip kod geliştirmede kullanabilir. Örnek olarak /bora ile sayfaya gelindiğinde sayfaya basılan “Bora Canakkaleye Hosgeldin.” yazısını url’ uygun bir şekle çevirelim. Aynı makalelere verilen ismin url’e dönüştürülmesi gibi. npm install urlify ile ilgili paket yüklenir. Urlify ile ilgili npm sayfasına buradan erişebilirsiniz.
İlgili kod aşağıdaki gibi değiştirilir. İndirilen urlify paketi options değerleri belirlendikten sonra ilgili yazı urlify(text) ile url’e uygun hale getirilir.
Urlify kullanılış şekli:
1 2 |
var urlify = require('urlify').create(options); urlify(text); |
NodeTest.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var http = require('http'); //urlify'ın yaratılması ve options detayları var urlify = require('urlify').create({ addEToUmlauts:true, szToSs:true, spaces:"_", nonPrintable:"_", trim:true }); var str=urlify('Bora Canakkaleye Hosgeldin.'); var server=http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); if(req.url=='/'){ res.write('Canakkaleye Hosgeldiniz.'); res.end(); }else if(req.url=='/bora'){ res.write(str); res.end(); }else if(req.url=='/asker'){ res.write('Canakkale Gecilmez Silahini Birakmayan Asker'); res.end(); }else { res.write('Page not found'); res.end(); } }); server.on('listening',function(){ console.log('ok, server is running'); }); server.listen(1915, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1915/'); |
Örnek Çıktı:
Biraz da Client Ve Server Socket mantığı üzerine konuşalım. Istemci / sunucu modeli ağ, bilgisayar tarihinin en temel olgularından biridir. Günümüzde birçok uygulama client/server modeli üzerine kurgulanmaktadır. Bu örnekte bir server socket yazılıp belli bir port dinlenecektir. Client bağlanınca, server tarafından ona data gönderip, ondan gelen data yazdırılacaktır. Aynı şekilde client socket yazılıp ilgili server’a bağlanınca client tarafından ilgili server’a data gönderilip, ondan gelen data yazdırılacaktır.
socketServer.js: Öncelikle net.createServer ile server socket yaratılır. Sonra server.listen gelicek clientlar belli bir porttan(9099) dinlenir. Eğer client connect olur ise clientdan gelen data (client.on(‘data’, function(data) {}) ve client’ın disconnect bilgileri (client.on(‘end’, function() {}) ile yazdırılır. client.write() ile bağlanan client’a data gönderilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
var serverPort = 9099; var net = require('net'); var server = net.createServer(function(client) { //client bilgileri yazılır. console.log('client connected'); console.log('client IP Address: ' + client.remoteAddress); console.log('is IPv6: ' + net.isIPv6(client.remoteAddress)); console.log('total server connections: ' + server.connections); // Client'dan gelicek data beklenir. client.on('data', function(data) { console.log('received data: ' + data.toString()); //Server'dan Client socket'e data gönderilir. client.write('Bu mesaj Serverdan gonderilmistir.'); }); // Client'ın socket'i kapattığı olay yakalanır.. client.on('end', function() { console.log('client disconnected'); }); }); server.on('error',function(err){ console.log(err); server.close(); }); server.listen(serverPort, function() { console.log('server started on port ' + serverPort); }); |
socketClinet.js: Client Socket server’a belli bir IP ve Port ile bağlanır ve data alışverişinde bulunur. Server’a net.connect (Ip,Port) ile bağlanır. client.write() ile server’a data gönderir. client.on(‘data’, function(data) {} ile serverdan ilgili data alınır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
function getDateTime() { var date = new Date(); var hour = date.getHours(); hour = (hour < 10 ? "0" : "") + hour; var min = date.getMinutes(); min = (min < 10 ? "0" : "") + min; var sec = date.getSeconds(); sec = (sec < 10 ? "0" : "") + sec; var year = date.getFullYear(); var month = date.getMonth() + 1; month = (month < 10 ? "0" : "") + month; var day = date.getDate(); day = (day < 10 ? "0" : "") + day; return year + ":" + month + ":" + day + ":" + hour + ":" + min + ":" + sec; } var serverPort = 9099; var server = 'localhost'; var net = require('net'); console.log('connecting to server...'); var client = net.connect({server:server,port:serverPort},function(){ console.log('client connected'); // send data console.log('clientdan servera data gonderilir : '+getDateTime()); client.write('client socketden selamlar... : '+getDateTime()); }); client.on('data', function(data) { console.log('received data: ' + data.toString()); client.end(); }); client.on('error',function(err){ console.log(err); }); client.on('end', function() { console.log('client disconnected'); }); |
Önce socketServer sonra clientServer çalıştırılır.
Örnek ekran çıktısı aşağıdaki gibidir: Böylece server ve client arasındaki iletişim node.js ile socket kullanılarak sağlanmış olunur.
Böylece node.js’e giriş yapmış olduk. Sayfalarda update yapamak için server’ı restart etmek ve visual studio gibi bir ortamda kod geliştirilememesi gibi eksiklikler haricinde gösterdiği performance ve düşük maliyeti ile neden bu kadar popüler olduğunu bana bir daha gösterdi. Özellikle web servisleri ve asenkron konularında kesinlikle göz ardı edilmemesi gereken bir Javascript Runtime Platformudur.
Yeni bir makalede görüşmek üzere hoşçakalın.
2. örnekteki (Client Ve Server Socket) kodları denedim, “Error: ECONNREFUSED” hatasıyla karşılaştım. Windows XP makinam. Hatayı gideremedim.
Selamlar;
.Öncelikle portu değiştirip denemeni tavsiye ederim.
.Bir de makinadaki firewall ayarlarına bir bakamak gerekebilir. Belki belli portları engelliyordur.
İyi çalışmalar.
Elinize sağlık Bora Hocam;
Çok güzel bir yazısı olmuş. Bende windows8 ile tüm kodlar çok güzel çalıştı.
Bilginize..
Başka port denedim ve Firewall’u kapadım yine çalışmadı fakat diğer Windows XP laptopumda denedim, çalıştı. Şu anki Windows’umun Networking kısmı sorunlu olmalı kesin.
Ancak yine bir sorum var: Client Ve Server Socket bağlantısı yaparken ‘net’ modülü kullanılıyor fakat başka biryerde ‘WebSocket’ kullanıldığını gördüm aradaki fark nedir?
Selam ömer;
Çalışmasına sevindim. Bana örnek kod gösterirsen sana daha cok yardım edebilirim.
Hoşçakal.
Selamlar Bora Hocam,
Değerli paylaşımlarınız için teşekkür ederiz, yakından takip etmekteyim.
Sizin signalr tecrübeniz malum, bundan yola çıkarak Nodejs ve Signalr karşlılaştırmalı bilgi verebilir misiniz? İkisi arasında performans, güvenlik, geliştirebilirlik yönetebilirlik güven verme avantaj dezavantaj gibi konularda sizin görüş ve tecrüblerinizi almak isterim.
Bende nodejs ile başlayıp tecrübeler edindikten sonra daha çok signalr ile devam etmekteyim.Bunda en büyük etkenlerden biri server tarafında bütün işi JS ye bırakmak gibi.
Bu konuda bilgilendirici bir makale yazabilirseniz çok fayadalı olacağını düşünüyorum.
İyi çalışmalar, tekrar teşekkür ederim.
Selamlar Tahsin;
Öncelikle yorumun için teşekkürler.
Bunun için bir karşılaştıma videosu yapabilirim. Ama hızlıca performans dersen sanki node.js bir adım önde. Ama geliştirme kolaylığı ve yönetilebilirlik signalR daha ağır basıyor.
Güvenlik konusunda 2 side gayet güvenli hale getirilebilir. Kullanacağın database göre seçimlerin değişebilir. Mesela MongoDb kullanılacak ise tabiki node.js ama Sql kullanılacak ise .Net teknolojilerini tercih edilmesi daha avantajlı olabilir. Azure tarafında 2 side gayet güzel çalışıyor o konuda da bir sıkıntı yok. Yani 2 sininde kendine göre + ve – leri var. İlk etapta aklıma gelenler bunlar. Ama bunlar tabiki benim görüşlerim. Asıl doğru sonuçları ölçümler gösterir. Vakit bulduğumda, 2’si ile de daha detaylı testler yapıp sayılarla konuşmayı tercih ederim:) Bu aralar bolca üniversitelere gideceğimden dolayı biraz yoğunum. Tarihler kesinleştikçe hepsini twitter’dan duyuracağım. İyi çalışmalar.
Merhaba hocam;
Bende SignalR ve NodeJS performans karşılaştırması hakkında video bekleyenlerdenim. Bir önceki yorumda karşılaştırma videosu yayınlayacağınızı belirtmişsiniz, ben mi bulamadım, yoksa daha çekmediniz mi?
Eğer video çekilmedi ve performans konusunda öğrenebildiğiniz bir bilgi varsa paylaşırsanız sevinirim teşekkür ederim :)
Selam Mustafa;
Karşılaştırma videosu çekmeye bir türlü fırsatım olmadı. Hatırlattığın için teşekkürler. Enkısa zamanda bu konuya el atıcağım.
Hoşçakal…
Emeğinize sağlık. Gerçekten güzel bir yazı olmuş.
Tesekkurler Enis. Umarim isinize yarar?
Hocam node.js zamanla php nin yerini alabilir mi? Çünkü node.js üzerinden mysql’den veri çekmek mümkün. Bu durumda php ihtiyaç kalmıyor gibi görünüyor. Kısaca php – mysql vs node.js – mysql
Selam Ümit,
Hepsinin yeri ayrı :)
Bence yerini almaz. 2 side güçlü ve kullanışlı.
İyi çalışmalar.
Hocam node.js mysql modülü ile php ye olan ihtiyacı kaldırıyor gibi görünüyor. Kısaca php – mysql vs node.js – mysql
Merhaba, son cevabınızın 18 Eylül olması biraz ümit kırıcı ama sorayım:
node.js konusundan bu gün bilgisayarıma yüklediğim Secunia PSI sayesinde haberdar oldum, güncellememi istedi.
Kısa bir araştırmadan sonra siteniz dahil bunun yazılımcı taraflı olduğunu gördüm.
Sorum şu ki, bir win 10 son kullanıcısı olarak bunu yüklememenin bana faydası nedir?
Teşekkürler.
Selamlar Tarik,
Ben her zaman cevap yazarım :) Senin kafana takacağın hiçbir problem yok. Secunia PSI Uygulaması arkada Nodejs kullanıyordur. Sağlıklı ve son versiyonunu kullanılması için güncelleme istemiştir. Eğer Secunia PSI’ı kullanmayacak isen nodejs’i kaldıra bilirsin. Ama boyutu az ve hiçbir zararı yoktur. Ayrıca güvenlik açığı oluşturmaz. Bence kodlamaya başlayıp NodeJs ile neler yapılabiliyor, socket nedir gibi başlıklara göz atabilirsin:) Bakarsın birgün sen de developer olursun :)
Hoşçakal. Hep böyle meraklı kal!
Bora Hocam Merhaba;
Paylaşımlarınız bizler için çok değerli.Hata bulma amacında değilim sadece çalıştırmak da sorun yaşayan arkadaşlar olabilir.
D:\nodejs\NodeTest.cs: ifadesini D:\nodejs\NodeTest.js: olarak düzenleyebilir misiniz?
Teşekkürler
Selam Barbaros,
Teşekkürler. Düzelttim. Niye yanlış anlıyım :) Zaten yanlış yazmışım :)
Eline sağlık..
Hoşçakal…
Merhaba hocam node.js yeni başladım node.js de local de bir modül kurmaya çalıştığımda
“npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.0”
gibi hatalar veriyor sebebi sizce ne olabilir.Kurduğum paket sorunsuz çalışıyor ama bu hatayı alıyorum
Selam,
Kurulumla ilgili bir uyumsuzluk sorunu.
Şunu deniyebilirsin: npm update –no-optional
İyi çalışmalar.
Hocam tekrar merhaba bu kodu denedim yine aynı hatayı veriyor. Bu tam olarak npm sürümüyle yüklenen modül arasındaki versiyon uyumsuzluğu mudur.Global yüklemede böyle bir hata almıyorum.Ayrıca bu hatayı vermeye devam ettiğinde yazdığım projede bir sorun çıkarır mı? Başka ne gibi bir çözümü olabilir?İnternette araştırdım kalıcı bir çözümü yok galiba…
Merhabalar node js uygulamaları sürekli çalışır hale nasıl getirebiliriz ? Command promp kapanınca sayfaya erişemiyorum . Bunun çozumunu arastırdır. Forever diye b,rsey buldum. Command Prompt kapanınca web sayfasına erişime devam edebiliyorum çok güzel. Ancak pc ye restart atınca yine erişemiyorum. Node uygulamalarının windows servis seklinde çalıstırabilmemiz mümkün müdür
Hocam Merhaba,
.net üzerinde çalışıyorum şu sıralar Node.js merakımı geçti araştırma öğrenme üzerindeyim, fakat merak ettiğim bir konu var acaba .net gibi katmanlı mimari veya OOP yapısı mevcutmudur. Varsa örnek bir yapı veya link gönderebilir misiniz
sELAM aZAT,
Node.Js ile OOP yazabilmen mümkün. Bunun için tavsiye edilen genelde mootools şeklinde bir tool.
İyi çalışmalar.
Hocam selamlar,
Öncelikle yazınız için çok teşekkür ederim. Sizden istediğim yakın bir zamanda MEAN Stack ve Angular FullStack kavramlarına örnek bir proje ile değinebilir misiniz ?
Tekrar teşekkür ederim ,
Saygılarımla.
Düzeltme : Node.js bir framework değildir. Node.js bir Javascript Runtime Environment’dır.
Teşekkürler Alp.
İlgili kısmı makalede düzelttim :)
nodejs ile bor oyun yaptim. Ancak sunucu tarafinda io.emit ya da socket.broadcast.emit kullandigim takdirde sunucu asiri kasiliyor.2 kisi dahi oynarken kasiyor. Sirf bu yuzden gunlerdir cabaladigim oyunu biraktim. Sunucu tarafinda socket.emit kullandigimda sorun yok. Gayet hizli. Ama benim bu veriyi tum istemcilere yollamam gerek. Bu konuda hicbir kaynak bulamadim. Bu konuda bir öneriniz var mi ?
Selamlar Mehmet,
Bence nodejs yerine bir de .Net Core 2.0’a fırsat ver. Bir de socket için SignalR kullan. Ve Scale et. SignalR scale için Redis, Azure veya Sql kullanabilirsin. Ondan sonra performance’ı göre. SignalR’ı 3 makinaya scale ettin mi sonucu bana da bildir.
İyi çalışmalar.
Bora hocam merhabalar,
Node js ile yazdığımız websitelerini illa cloud yada virtual server’a mı kurmamız gerekir?
Türkiyede hostingler zamanla php mysql hizmeti verdikleri gibi zamanla node ve NoSql hizmeti vermeye başlarlarmı düşünceleriniz nelerdir
Selam Burak,
NoSql hizmeti veren firmalar biliyorum. NodeJs hizmeti de bence zamanla olur diyorum. Ama belki o da vardır. Bilgi dahilimde değil. Arz talep meselesi. Eğer talep artar ise mutlaka hizmeti de gelir.
İyi çalışmalar.
Bilgiler için teşekkürler, açıklayıcı ve faydalı olmuş.
Teşekkürler Onur,
Merhaba hocam,
Node.js ve sublime text gibi programlar için gerekli bir bilgisayarin minimum ne tür özellikleri olmasi gerekir? Benim tablet bilgisayarım oldugu icin maalesef programlari kursam dahi kullanma imkanim olmadi. Cevabiniz icin tesekkur ederim :)
Türkçe kaynak konusunda değerli , verimli , ilgili ,bilgili içerik üreten bir kişisiniz . Ellerinize sağlık , Bora bey :)
Çok teşekkür ederim Sezer Bey.
Bora bey merhaba ,
Real time veri akışı için sizce en iyi çözüm nedir.
Bu arada paylaşımlarınızı çok beğendim elinize sağlık.
Selamlar Yusuf,
Öncelikle teşekkürler..
Şimdi en iyi çözüm, soruna ve önceliğe göre değişiklik gösterir. Sizin amacınız nedir?
Bora bey nodejs ile neler yapilabilir hangi alanda kullanabiliriz biraz bilgi verebilir misiniz? Teşekkür
Teşekkürler
Ben teşekkür ederim.
Webrtc nodejs yazilimdan anlayan biri varsa yazilima ozellik ekletecem telim 0530 680 05 47 ismim muhammet
Bende node.js yazılımı var chat sohbet olarak yazilimda calisian 2 3 tane yazilimci oldu ama ufak tefekleri yapdilar ozellik eklediler ama nedense coklu konusma sitemi yapdirmak istedim bilenlerde yok cocum hasta yok musait degilim dediler anlaycaniz bekliom öyle saglam yazilimci bekliyorum bu arada birsenpanel.com adresinden giris yapip demo girise gelirseniz node .js yazilimi chat larak görürsunüz yardim edecekeler cin yazdim bu yazimi