NodeJS Ad?m 10 Express Framework 2

Ad?m Ad?m Nodejs yaz? dizimizinbir nceki blmndeexpressjs frameworkne giri? yapm??, ilk uygulamam?z? yazm??t?k. Devam?nda routing yani ynlendirme i?lemlerini ele ald?k. Son olarakta statik dosya ynetimini anlat?p sonland?rd?k.Bu ad?mda expressjs ierisinde bulunan middleware kavram?ndan ve express application generator’den bahsedece?im.

Middleware

Bu blmde ise middleware kavram?yla ba?layaca??z. Web projeleri do?as? gere?i request-response yap?s?na sahiptir. Kullan?c? yazm?? oldu?umuz uygulamaya bir istekte bulunur(request). Uygulama bu iste?i al?r belli a?amalardan geirerek istek yapan kullan?c?ya bir cevap olu?turur ve yollar(response). Burada bahsetti?imiz a?amalar kullanm?? oldu?umuz framework’e gre de?i?ir. Bizim nodejs ile kulland???m?z expressjs de belirli a?amalara sahiptir. Gelen istekler expressjs’nin ya?am dngs ierisindeki her bir a?amadan geerek cevap olu?turulur. ??te bu her bir a?amaya expressjs’de middleware denir.

Middleware asl?nda bir fonksiyondur. Fonksiyon imzas? ?u ?ekildedir:function(req, res, next) { … } .Buradaki req (request) ile bize gnderilen istek hakk?ndaki bilgilere ula?abiliriz, res (response) ile verilecek olan cevaba mdahale edebiliriz, next ile de bir sonraki middleware fonksiyonunu al??t?rabiliriz. ?imdi basit bir middleware fonksiyonu yazal?m. Bu middleware fonksiyonu her gelen istekte konsol zerine log yazacak. Kodlar?m?z ?u ?ekilde:

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

var logger= function (req, res, next) {
 var tarih = new Date(); 
 var formatliTarih = tarih.getDate() + "." + (tarih.getMonth() + 1) + "." + tarih.getFullYear(); 
 formatliTarih += " " + tarih.getHours() + ":" + tarih.getMinutes();
  console.log(formatliTarih + ':Yeni istek')
  next()
};

app.use(logger);
 
app.get('/',function (req,res) {
    res.send('Merhaba Dnya!');
});
 
app.listen(3000,function () {
    console.log('Uygulama 3000 portunda al??makta.')
});

express expressjs middleware

Yukardaki kodlar? inceledi?imizde daha nceki yaz?lar?mda anlatt???m web server kodlar? ile hemen hemen ayn?. Fark 4. sat?rda ba?l?yor. logger ad?nda bir fonksiyon olu?turuyoruz. Bu fonksiyon 3 tane parametre al?yor: req, res ve next. Yani middleware fonksiyon format?na uygun. Bu fonksiyon ierisinde 8. ad?mda bahsetmi? oldu?umuz tarih format?n? olu?turuyoruz. Di?er ad?mda da konsol zerine bu tarihi ve ”Yeni istek”yaz?s?n? yazd?r?yoruz. Fonksiyonun son sat?r?nda da parametre olarak gelen next() fonksiyonunu al??t?r?yoruz. 12. sat?rdada app.use(logger); ile bu fonksiyonu uygulamam?za bir middleware olarak kullanmas?n? sylyoruz. Daha sonraki kodlar? 9. Ad?mda anlatm??t?k. Uygulamam?z? al??t?rd???m?zda logger middleware gelen her istek iin konsol ekran?na tarihi ve yeni bir istek geldi?ini belirten yaz?s?n? yazacak.En basit hali ile bir middleware fonksiyonu yazm?? olduk.

Bir sonraki rne?imizde bu middleware yap?s?n? modlle?tirip d??ardan yaz?lm?? middleware fonksiyonlar?n? nas?l kullanaca??m?z? grece?iz. logger-middleware.js dosyam?zdaki kodlar?m?z ?u ?ekilde:

module.exports = function (ayarlar) {
    return function (req, res, next) {
        if (ayarlar.tarih) {
            var tarih = new Date();
            var formatliTarih = tarih.getDate() + "." + (tarih.getMonth() + 1) + "." + tarih.getFullYear();
            formatliTarih += " " + tarih.getHours() + ":" + tarih.getMinutes();
            console.log(formatliTarih + ':Yeni istek')
        } else {
            console.log('Yeni istek')
        }
        next()
    }
}

Burada basit bir modl yazd?k. Asl?nda nceki rne?imizdeki logger middleware fonksiyonunu modle ta??d?k. Ek olarak ayarlar ekledik. Fonksiyon ierisinede bir if blo?u ile e?er ayarlar ierisindeki tarih de?i?keni true ise konsola tarihle beraber “Yeni istek” yazd?r de?ilse sadece “Yeni istek”yazd?r dedik. Birde bu logger modlmzn kullan?m?na bakal?m. program.js dosyam?z?n son hali ?u ?ekilde:

var express = require('express');
var logger = require('./logger-middleware')

var app = express();

app.use(logger({ tarih: true }));

app.get('/', function (req, res) {
    res.send('Merhaba Dnya!');
});

app.listen(3000, function () {
    console.log('Uygulama 3000 portunda al??makta.')
});

express expressjs middleware

Buras?da nceki rnek ile neredeyse ayn?. En stte logger-modle modlmz logger de?i?kenine atad?k. Bu de?i?kenide 6. sat?rda kulland?k. Tek fark ierisine bir nesne al?yor olmas?. Bu nesnede bizim ayarlar de?i?kenine kar??l?k gelmektedir. { tarih:true } k?sm?n? ayr? bir de?i?kene atay?p sonra o de?i?keni buraya verebilirdik. Ama javascript ekosistemindeki genel kullan?m bu ?ekildedir. program.js dosyas?n? al??t?rd???m?zda nceki rnekle ayn? ?kt?y? elde ederiz. E?er ayarlardaki tarih de?ikenine false de?erini atarsak farkl? bir sonu grrz.

Kendi middleware fonksiyonlar?m?z? yazd?k. Bunlar? modllere de ay?rd?k. Peki her?eyi bu ?ekilde biz mi yazaca??z? Tabiki hay?r. Expressjs iin yaz?lm?? tonlarca middleware bulabilirsiniz. Hatta expressjs ierinde bile birsr haz?r middleware bulunmaktad?r. Hatta ve hatta uygulamam?zda yazd???m?z app.get(…) app.post(…) methodlar?n?n ierisine yazd?klar?m?zda birer middleware.

Expressjs middleware trlerini 5e ay?rm??

  • Application-level middleware
  • Router-level middleware
  • Error-handling middleware
  • Built-in middleware
  • Third-party middleware

?imdi bunlara basit birer rnek vererek a?klayal?m. Kodlar?m?z ?u ?ekilde:

var express = require('express');
var app = express();
var router = express.Router();
var cookieParser = require('cookie-parser');

// Application-level middleware
app.use(function (req, res, next) {
    console.log(Date.now() + ': Yeni istek, Method:' + req.method + ', URL:' + req.originalUrl)
    next();
});

app.get('/', function (req, res, next) {
    res.send('Merhaba Dnya!');
    next();
});

app.get('/', function (req, res, next) {
    res.send('Ana Sayfa');
});

// Router-level middleware
router.use(function (req, res, next) {
    console.log('Yeni istek(Router-level middleware):', Date.now());
    next();
})

app.use('/', router)

// Error-handling middleware
app.use(function (err, req, res, next) {
    console.error("Hata:" + err.stack);
    res.status(500).send('Bir hata olu?tu!');
});

// Built-in middleware
app.use(express.static('public'));

// Third-party middleware
app.use(cookieParser());

app.listen(3000, function () {
    console.log('Uygulama 3000 portunda al??makta.');
});

rne?imizi inceledi?imizde en stte modllerimiz yklyoruz. Daha sonras?nda middleware kullan?mlar?n? gryoruz. Daha nce kulland???m?z app.use(…), app.METHOD(…) (METHOD dan kast?m?z GET,PUT,POST,DELETE… gibi http metotlar?) kullan?mlar? asl?nda bir Application-level middleware. Burada farkl? olarak sadece dikkat etmenizi istedi?im ayn? route tan?m?na sahip app.get(‘/’, … ) fonksiyonlar?n?n nas?l al??t???. Dikkat ederseniz ilk app.get(‘/’, … ) tan?m?ndan sonra next() fonksiyonu al???yor. Bu sayede ilk middleware kendi ierisindeki i?ini tamamlad?ktan sonra di?er middleware’a gemek iin next() fonksiyonunu al??t?r?yor. Bir sonraki app.get(‘/’, … ) middleware’?n route tan?m?da gelen iste?e uydu?u iin oda al???yor. ?kinci app.get(‘/’, … ) tan?m? ierisinde next() al??t?r?lmad??? iin 3. bir app.get(‘/’, … ) tan?m? olsayd? al??mazd?.

22. sat?ra bakacak olursak daha nce kullanmad???m?z expressjs ierisindeki Route-level middleware kullan?m? grmekteyiz. Bunu kullanmak iin ncelikle en stte var router = express.Router() tan?m? yapt???m?za dikkat edin. Asl?nda kullan?m olarak daha nceki app.METHOD( … ) kullan?m?ndan pek bi fark? yok. 22. sat?rda ba?layan route-level middleware kullan?m? ncekilerle birebir ayn?. As?l dikkat edilmesi gereken yer 27. sat?rda yap?lan app.use(‘/’, router) tan?m?. Bu tan?m ile expressjs route tan?m? ierisinde yapm?? oldu?umuz de?i?iklikleri expressjs sistemine tan?tm?? oluyoruz.

Bir di?er middleware e?idi de Error-handling middleware. Error-handling middleware sistem zerinde herhangi bir hata gerekle?ti?inde al???r. 30. sat?rda tan?mlad???m?z Error-handling middleware kullan?m?nda dikkat etmemiz gereken yer fonksiyon imzas?. Burada kullan?lan fonksiyon 4 parametre almaktad?r: app.use(function(err, req, res, next ){ … }); . Buradaki err parametresi ile meydana gelen hata hakk?nda ekstra bilgiler elde edip hata trne gre i?lem yapabiliriz.

36. sat?rda Built-in middleware rne?i bulunmakta. Asl?nda bu tan?m daha kulland???m?z statik dosya tan?mlama ad?m?. public klasrndeki varolan dosyalar? d?? kullan?ma amaya yar?yor.

Son middleware trmzde Third-party middleware’lar. rne?imiz 39. sat?rda. Tabi bunlar? kullanmadan nce en stte yapt???m?z gibivar cookieParser = require(‘cookie-parser’)?eklinde modllerini yklememiz gerekiyor. Asl?nda bunlar bizimde yukar?da kendimiz iin yazd???m?z middleware gibi expressjs toplulu?unun genel kullan?m iin yazd??? middleware’lar. Cookie-parser da bunlardan birtanesi. Bunun gibi daha bir ok third-party middleware listesine buradan ula?abilirsiniz. Tabi hepsinin ne i?e yarad???n? ve nas?l kullan?ld???n? herbirinin kendi dkmantasyonunda bulabilirsiniz.

Express application generator

Express application generator asl?nda kk bir npm arac?. Bu ara ile expressjs iin nerilen dosya sistemini otomatik olu?turabilir, varsay?lan paketleri indirebilir, sundu?u seenekler ile view engine, css engine gibi s?k kullan?lan yard?mc? aralardan istedi?imizi seebiliriz.

ncelikle yklememiz gerekiyor. Yklemek iin ?u komutu al??t?rmam?z yeterli:

npm install express-generator -g

Kulllan?m? hakk?nda bilgi almak iin terminalde ?u komutu vermemiz yeterli:

express --help

Bu komutun ?kt?s? ?u ?ekilde:

> express --help

  Usage: express [options] [dir]


  Options:

        --version        output the version number
    -e, --ejs            add ejs engine support
        --pug            add pug engine support
        --hbs            add handlebars engine support
    -H, --hogan          add hogan.js engine support
    -v, --view <engine>  add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
    -c, --css <engine>   add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
        --git            add .gitignore
    -f, --force          force on non-empty directory
    -h, --help           output usage information

Temel Terminal Komutlar?

Grd?nz gibi kullan?m? olduka kolay. Yeni bir proje olu?turmak iin terminalde projeyi olu?turmak istedi?imiz klasre gidiyoruz. Daha sonraexpress –view=pug uygulamaAdi komutunu vermemiz yeterli. Bu komutun ?kt?s? da ?u ?ekilde:

> express --view=pug uygulamaAdi

   create : uygulamaAdi
   create : uygulamaAdi/package.json
   create : uygulamaAdi/app.js
   create : uygulamaAdi/public
   create : uygulamaAdi/routes
   create : uygulamaAdi/routes/index.js
   create : uygulamaAdi/routes/users.js
   create : uygulamaAdi/views
   create : uygulamaAdi/views/index.pug
   create : uygulamaAdi/views/layout.pug
   create : uygulamaAdi/views/error.pug
   create : uygulamaAdi/bin
   create : uygulamaAdi/bin/www
   create : uygulamaAdi/public/javascripts
   create : uygulamaAdi/public/images
   create : uygulamaAdi/public/stylesheets
   create : uygulamaAdi/public/stylesheets/style.css

   install dependencies:
     > cd uygulamaAdi && npm install

   run the app:
     > SET DEBUG=uygulamaadi:* & npm start

Yukardaki komuta –view=pug parametresini ekleyerek view engine olarak pug kullanmas?n? istedi?imizi belirttik. Daha sonras?nda ekledi?imiz uygulamaAdi ise tahmin edebilece?iniz gibi olu?turmu? oldu?umuz uygulaman?n ad?(Ayn? zamanda uygulaman?n klasr ad?). Komutu al??t?rd???m?zda bize hangi klasrleri olu?turdu?unu listeliyor. Hemen alt?ndacd uygulamaAdi && npm installkomutu ile ba??ml? oldu?u paketleri yklememiz gerekti?ini belirtiyor. Sonras?nda iseSET DEBUG=uygulamaadi:* & npm startkomutu ile uygulamam?z? al??t?rabilece?imizi belirtiyor. Tabi buradaki dosyalar ve paketler varsay?lan, klasr yap?s? ise tavsiye edilen klasr yap?s?d?r. Bunlar? istedi?iniz gibi de?i?tirebilir ve dzenleyebilirsiniz. Zaten yukar?daki help ieri?ini inceledi?imizde view engine, css engine, git deste?i, handlebars deste?i, ejs, hogan.js gibi ekstra paketler/zellikler ekleyebile?imizi grebiliyoruz. Projenize bunlar? katarak daha zengin ve kullan?m? kolay bir geli?tirme ortam? olu?turabilirsiniz. Tabi bunlar d???nda julpjs gibi kendinizde d??ardan eklemeler yapabilirsiniz. Bunlar tamamen size kalm??.

Makalede kullan?lan kodlaraburadanula?abilirsiniz.


[jetpack_subscription_form]

 

NodeJS Ad?m 9 – Express Framework

Ad?m Ad?m Nodejs yaz? dizimizinbir nceki blmndeweb server olu?turmay? ve kendi web sitelerimizi nas?l yapabilece?imizi grdk.

Peki bu i?in daha profesyonel olan bir yolu yok mu? Daha kolay bir ?ekilde web sitesi yapabilece?imiz, bir ok angarya i?ten bizi kurtaracak bir yol yok mu? Tabiki var. Nodejs iin yaz?lm?? Express Web Framework’u tamda bu i?e yar?yor. npm zerinden paket olarak ykleyebilece?imiz Express sayesinde Url parse i?lemlerini(routing) daha kolay bir ?ekilde yapabilir, statik dosya ynetimi i?lerimizi daha kolay bir ?ekilde yapabiliriz. K?saca nodejs ile web sitesi/uygulamas? yapmak iin gerekli tm alt yap?y? Expressjs bize sa?lamaktad?r. Express’i yklemek iin konsolanpm install express –saveyazmam?z yeterli. Express’te di?er paketler gibi yklenecektir. Kk bir rnek yapal?m.

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

app.get('/',function (req,res) {
    res.send('Merhaba Dnya!');
});

app.listen(3000,function () {
    console.log('Uygulama 3000 portunda al??makta.')
});

9-1-express

Yukar?daki rne?imizde basit bir web uygulamas? yapt?k. Kodda neler oldu?una tak?lmay?n. A?a??da ayr?nt?lar? anlataca??m.

Ynlendirme ( Routing )

Routing yani Ynlendirme gelen Url’e gre nas?l bir i?lem yap?lmas? gerekti?ini, nereye ynlendirilmesi gerekti?ini belirtti?imiz yap?d?r. Express Framework’de bunu yapmas? ok kolayd?r. Express ierisindeki routing yap?s? Http methotlar?yla al???r. Genel yap?app.METHOT(URL_YOLU, CALLBACK) ?eklindedir. Metot k?sm?nda Http protokolnn GET, POST, PUT, DELETE … gibi metotlar?ndan biri kullan?l?r.

“Bildi?iniz gibi web siteleri/uygulamalar? HTTP protokol zerinde al???r. Siz bir taray?c?ya site adresini yazd???n?zda Sunucuya HTTP protokol zerinden HTTP’nin herhangi bir metodu ile beraber gider. Bu sayede sunucu zerinde url ve http metoduna gre i?lem yap?labilir. Varsay?lan HTTP Metodu GET metodudur. Siz taray?c? zerinden bir adrese girmeye al??t???n?zda taray?c? varsay?lan olarak GET metodunu kullan?r.”

URL_YOLU k?sm?na URL paterni yaz?l?r. Gelen url bu paterne uyuyorsa CALLBACK fonksiyonu al??t?r?l?r. Callback fonksiyonu iki de?i?ken al?r. Birincisi request yani istekler hakk?nda bilgi ald???m?z, di?eri response yani dn?leri ynetti?imiz de?i?ken. (De?i?ken adlar?n? istedi?iniz gibi de?i?tirebilirsiniz.) Routing ile alakal? bir rnek yapal?m.

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

app.get('/',function (req,res) {
    res.send('Ana Sayfa!');
});

app.post('/',function (req,res) {
    res.send('Ana Sayfa Post!');
});

app.get('/Sayfa1',function (req,res) {
    res.send('Sayfa 1!');
});

app.post('/SayfaPost',function (req,res) {
    res.send('Sayfa Post!');
});

app.put('/SayfaPut',function (req,res) {
    res.send('Sayfa Put!');
});

app.delete('/SayfaDelete',function (req,res) {
    res.send('Sayfa Delete!');
});

app.listen(3000,function () {
    console.log('Uygulama 3000 portunda al??makta.')
});

9-2-express-routing

(Gif’te kulland???m uygulaman?n ad? Postman. Postman ile web sitelerini/uygulamalar?n? Url ve Http metoduna gre simule edebilirsiniz. Buradan indirebilirsiniz.)

Kodlar?m?za bakacak olursak ilk olarak yklemi? oldu?umuz express paketini express de?i?kenine att?k. Daha sonra app isminde bir express uygulamas? olu?turduk. Bir sonraki i?lemde bir route olu?turuyoruz. Bu route zerinde url olarak ‘/’ girildi?inde yani bo? b?rak?ld???nda ne olmas? gerekti?ini belirttik. Bunun iin olu?turmu? oldu?umuz app uygulamas?n?n get fonksiyonunu kulland?k. get fonksiyonunun callback fonksiyonu iki de?i?ken al?yor: req,res. Birisi request yani iste?i ynetti?imiz req di?eri response yani cevab? ynetti?imiz res de?i?keni. Callback fonksiyonu ierisinde res de?i?keninin send fonksiyonu ile kullan?c?ya bilgi gnderebiliyoruz. Burada kullan?c?ya Ana Sayfa! yaz?s?n? gnderdik. Di?er route i?leminde yine url olarak ‘/’ girildi?inde ama Http Post metodu kullan?ld???nda ne olmas? gerekti?ine bak?yoruz. Di?er route i?lemlerinde farkl? Http metodlar? ve farkl? Urller zerinde neler yap?lmas? gerekti?ini belirtiyoruz. Mant?k basit. Http metodunu se, Url belirle, callback yaz. Expressdeki route mant??? bu kadar. Yukar?daki Gif zerinde Urllere yanl?? Http metot ile ba?lan?rsan?z nas?l tepki verdi?ini grebilirsiniz. rnek kodumuzun son blmnde de app express uygulamas?n? 3000 portundan al??mas?n? sa?l?yoruz.

Route ile alakal? ba?ka bir rnek yapal?m. Kodlar?m?z ?yle:

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

app.get('/',function (req,res) {
    res.send('Ana Sayfa!');
});

app.all('/sayfahepsi',function (req,res) {
    res.send('Sayfa Hepsi!');
});

app.get('/ab?cd',function (req,res) {
    res.send('Sayfa ab?cd!');
});

app.get('/de+fg',function (req,res) {
    res.send('Sayfa de+fg!');
});

app.get('/hi*jk',function (req,res) {
    res.send('Sayfa hi*jk!');
});

app.get('/sayfa/:degisken1/parametre/:degisken2', function(req, res) {
    res.send(req.params);
});

app.listen(3000,function () {
    console.log('Uygulama 3000 portunda al??makta.')
});

9-3-express-route

rne?imize bakacak olursak asl?nda bir nceki rnek ile neredeyse ayn?. Ba?lang?ta yine bir express uygulamas? olu?turduk. Sonras?nda route’lar tan?mlad?k. Sonras?nda uygulamay? 3000 portu zerinden at?k. Aradaki fark route tan?mlama i?lemlerinde. ?lk route tan?m? ilk rnekteki ile ayn?. ?kinci route tan?m?na bakacak olursak, farkl? olarak app.all(…) fonksiyonu kullan?ld?. Bu fonksiyon URL sa?land??? srece bu route tan?m?n?n btn HTTP metotlar?yla al??aca??n? gsteriyor. nc route tan?m?na bakal?m. Burada da farkl? olarak URL k?sm?nda “/ab?cd” ifadesi kullan?ld?. Buradaki ? i?areti kendinden nceki gelen harfin seimlik oldu?unu gsteriyor. Yani biz taray?c? zerinden “/abcd” de yazsak “/acd” de yazsak yine bu route al??acak demektir. Drdnce route tan?m?nda ise URL k?sm?nda “/de+fg” ifadesi kullan?ld?. Buradaki + i?aretinin anlam? ise kendinden nceki gelen harfin istedi?i kadar o?alt?labilece?i anlam?na geliyor. Yani “/defg” de yazsak “/deeeeeefg” de yazsak bu route al??acak. Be?inci routing tan?m?nda ise URL k?sm?nda “/hi*jk” ifadesi kullan?ld?. Buradaki * i?aretinin anlam? araya istedi?iniz yazabilirsiniz demek. Yani “/hijk” yazsakta “/hi123456jk” yazsakta bu route al??acak demektir. Alt?nc? ve son route tan?m?na bakacak olursak burada da URL ierisinde degisken1 ve degisken2 diye iki tane degi?ken tan?m? bulunmaktad?r. De?i?ken tan?mlar? nlerine konan : i?areti ile belirtilmektedir. URL ierisindeki bu de?i?kenlere ne yaz?l?rsa Program ierisinden onlara eri?ebiliriz demektir. Bu de?i?kenlere route tan?m?n?n callback fonksiyonundaki req de?i?keninin params de?i?keni ile eri?ebiliriz. rne?in URL ”/sayfa/111/parametre/222″ yazd???m?zda bu de?i?kenlere “req.params.degisken1” yada “req.params.degisken2” ?eklinde eri?ebiliriz. Btn bu route tan?mlar?n?n ?kt?s?n? yukar?daki Gif zerinde grebilirsiniz. Express Framework’n route yap?s? hakk?nda daha fazla bilgiye bu adresten ula?abilirsiniz.

Sabit Dosyalar ( Static Files )

Bir nceki blmde hat?rlarsan?z yaz?lan Url’e gre dosya dndrmeyi ?renmi?tik. Ayn? i?lemi express zerinde route tan?mlayarak da yapabiliriz. Ama byk projelerin o?unda onlarca css, js ve resim dosyalar? vard?r. Hepsi iin tek tek route tan?mlamas? m? yapmam?z gerekiyor? Tabiki hay?r. Express Frameworkn yazarlar? bunu d?nm? ve bunun iin Statik Files zelli?ini yazm??lar. Bir rnek zerinden gidelim. Kodlar?m?z ?yle:

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

app.get('/',function (req,res) {
    res.send('Ana Sayfa!');
});

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

app.use('/js',express.static('static'));

app.listen(3000,function () {
    console.log('Uygulama 3000 portunda al??makta.')
});

9-4-express-static

rne?imizin ilk blmnde daha nceki rneklerde grd?mz gibi express modln a??r?p app isminde bir uygulama olu?turuyoruz. Devam?n bir route tan?mlamas? yazp?yoruz. Son blmde de hangi port zerinde al??aca??n? belirliyoruz. Buraya kadar her?ey ayn?. Farkl? olan 8. ve 10. sat?rlar. 8. sat?rda uygulamam?zda public klasrnn d??ar?dan direkt olarak eri?ilebilece?ini ifade ediyoruz. Yani public klasr ierisinde bulunan btn dosyalar? URL’in sonuna ekleyerek a??rabiliriz. (klasrn ad?n? yani public yazmadan). 10. sat?rda ise sanal klasr kullan?yoruz. Yani static klasrnn ierisindeki her?eyi d??ar?dan eri?ime a?yoruz.(klasrn ad?n? yani static yazmadan). Ama bu dosyalara eri?irken ba??na js yazarak eri?iyoruz. Yukar?daki gifte kodun al???r hali dosya sistemi ile gsterilmektedir. Sizlerde denemeler yaparsan?z akl?n?zda daha net oturacakt?r.

Bir sonraki blmde middleware kavram?na ve express generator kavramlar?na de?inece?iz.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.


[jetpack_subscription_form]

NodeJS Ad?m 8 – Web Server

Ad?m Ad?m Nodejs yaz? dizimizinbir nceki blmndeHttpClient olu?turmay? yani bir web sayfas?na ba?lanmay? ve nodejs zerinde olay(event) kullanmay? grdk. Bu blmdede tam tersi Http server olu?turmay? grece?iz. Yani bilgi alan de?il bilgi veren olaca??z, ba?lanan de?il ba?lan?lan olaca??z.

Server olu?turmak iin yine nodejsin http modln kullanaca??z. ?lk rne?imizde server?m?za ba?lananlara o anki saati gsteren bir uygulama yapaca??z. Kodlar?m?za geelim:

var http = require("http")

var server = http.createServer(function (request, response) {
    var tarih = new Date();
    var formatliTarih = tarih.getDate() + "." + (tarih.getMonth() + 1) 
    + "." + tarih.getFullYear();
    formatliTarih += " " + tarih.getHours() + ":" + tarih.getMinutes();
    console.log(formatliTarih)
    response.end(formatliTarih)
})
server.listen(8080)
console.log("Server Ba?lat?ld?. Taray?c? zerinden http://localhost:8080"
           +" adresinden ula?abilirsiniz.")

8-1-node-server

Yukar?daki kodda ok basit bir server rne?i var. Ad?m ad?m a?klayal?m. ?lk sat?rda http modln a?ar?yoruz. Bir sonraki sat?rda http.createServer(…) fonksiyonu ile yeni bir server olu?turuyoruz ve bunu server de?i?kenine at?yoruz. createServer fonksiyonuna callback fonksiyonu olarak verdi?imiz fonksiyonu inceleyelim. Bu fonksiyon servera her a?r? yap?ld???nda al???r. request ve response olmak zere iki parametre al?yor. request servera yap?lan istek hakk?nda bilgi almak iin kullan?l?yor, response ise yap?lan iste?e cevap dndrmek iin kullan?l?yor. Fonksiyonun ilk sat?r?nda bir tarih nesnesi olu?turuluyor. Daha sonraki iki sat?rda ekrana formatl? olarak tarih yazd?rmak iin formatliTarih de?i?keni olu?turup de?erini at?yoruz. Daha sonraki sat?rda konsol ekran?na formatliTarih nesnesini yazd?r?yoruz. Bir sonraki sat?rda response nesnesini kullanarak yap?lan iste?e cevap dndriyoruz. Sonraki sat?rda yani server.listen(8080) kodu ile olu?turmu? oldu?umuz server? 8080 portu zerinden ba?lat?yoruz. Sonraki sat?rda da konsola server?m?z?n ba?lad???n? haber veren bir yaz? yaz?yoruz. Bu kadar. Bu kodu al??t?rd???m?zda server nesnesi ba?lam?? ve kendisine yap?lan her iste?e cevap verebilir halde olacak. Her yap?lan istekte callback fonksiyonu al??acak ve geriye o anki tarih saati bizim belirledi?imiz formatta geri dnderecek. Servera ula?mak iin herhangi bir taray?c? zerinden http://localhost:8080 yada 127.0.0.1:8080 yazmam?z yeterlidir.

NOT: Konsolda program? al??t?rd???n?zda server srekli al??acakt?r. Kapatmak iin CTRL + C tu?lar?n? kullanabilirsiniz.

Gelelim di?er rne?imize. Bu rne?imizde de geriye bir html dosya ieri?ini dnderece?iz. Kodlar?m?z ?u ?ekilde:

program.js dosya ieri?i:

var http = require("http")
var fs=require("fs")

var server = http.createServer(function (request, response) {
    fs.createReadStream("ornek.html").pipe(response)
})
server.listen(8080)
console.log("Server Ba?lat?ld?. Taray?c? zerinden http://localhost:8080"
           +" adresinden ula?abilirsiniz.")

ornek.html dosya ieri?i:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>rnek Html Dosyas?</title>
</head>
<body>
    <h1>rnek Html Dosyas?</h1>
</body>
</html>

8-2-node-server

?ki dosya ieri?imizde yukar?daki gibi. Html dosyas?n?n ieri?i basit zaten. A?klamaya gerek yok. program.js dosyas?n?n ierisine bakacak olursak bir nceki rnekten ilk farkl? ikinci sat?rda fs modlmz a??r?yor olmam?z. Di?er farkl? ise calback fonksiyonu. Callback fonksiyonunda fs modlnn createReadStream fonksiyonunu kullan?yoruz. Bu fonksiyon parametre olarak okuyaca?? dosyan?n ad?n? al?yor ve bir okuma i?lemi ba?lat?yor. Fonksiyonun devam?ndaki pipe fonksiyonu ise ?u demek. ?lk i?lemin ?kt?s?n? al ikinci i?leme ver. ?lk i?lem yani ornek.html dosyas?n?n okunma i?leminin ?kt?s? yani ornek.html dosyas?n? al sonraki i?lem yani pipe fonksiyonuna parametre olarak verilen response nesnesine ver. Tabi response nesneside dosyay? al?p cevap olarak gnderecek. Cevab? yani html dosyas?n? alan taray?c?da html ieri?ini i?leyip ekranda gsterecek. Kodlar?m?z bu kadar. Sonuta yukar?dakigifte grld? gibi.

Bir sonraki rne?imizde gelen URLe gre dosya gnderece?iz. rnek kodlar?m?z ?u ?ekilde:

var http = require("http")
var url = require("url")
var fs = require("fs")

var server = http.createServer(function (request, response) {
    var urlObject = url.parse(request.url)
    if (urlObject.pathname == '/ornek1') {
        fs.createReadStream('ornek1.html').pipe(response)
    } else if (urlObject.pathname == '/ornek2') {
        fs.createReadStream('ornek2.html').pipe(response)
    }
    else {
        fs.createReadStream('ornek.html').pipe(response)
    }
})
server.listen(8080)
console.log("Server Ba?lat?ld?. Taray?c? zerinden http://localhost:8080"
           +" adresinden ula?abilirsiniz.")

8-3-node-server

Kodlar?m?za bakacak olursak kulland???m?z 3 tane modlmz var: http, url ve fs. Sonras?nda daha nce ?rendi?imiz server olu?turma i?lemini yap?yoruz. As?l incelememiz gereken yer callback fonksiyonunun ierisi. Callback fonksiyonunun ilk sat?r?nda bize gnderilen yani kullan?c?n?n taray?c?ya yazm?? oldu?u urli parse(ayr??t?rma) i?lemine al?yoruz ve urlObject de?i?kenine at?yoruz. Bylece url hakk?nda her?eye daha sade olarak eri?ebiliriz. Daha sonras?nda basit if deyimleriyle urlye yaz?lan de?erleri kontrol ediyoruz. Ben burada sadece iki tanesini kontrol ettim. ?sterseniz daha fazlada yapabilirsiniz. Hatta isterseniz gelen de?erle ayn? isimde dosyalar? dndrebilirsiniz. Ben basit olmas? a?s?ndan o konulara girmeyece?im. Bu if ifadelerinin ierisinde de url de?erine gre daha nce grd?mz gibi kullan?c?ya dosya gnderiyoruz. En son else k?sm?nda da geriye kalan her ihtimal iin ornek.html dosyas?n? gnderiyoruz. Bu kadar. Html ve css biliyorsan?z art?k nodejs ile basit bir site yapabilirsiniz 🙂

Gelelim di?er ve blmn son rne?ine. Bu rnekte bir nceki blmde kulland???m?z hava durumu servisi gibi bir servis yazaca??z. Tabi biz hava durumunu bilemeyece?imiz iin daha basit bir servis yazaca??z. Bildi?imiz en basit ?ey tarih/saat. Servisimize /tarih yaz?nca gn, ay, y?l , /saat yaz?nda saat, dakika, saniye dndren bir servis yazaca??z. Kodlar?m?z ?u ?ekilde:

var http = require("http")
var url = require("url")

var server = http.createServer(function (request, response) {
    var urlObject = url.parse(request.url)
    var zaman=new Date()


    if (urlObject.pathname == '/tarih') {
        var tarih={ 
            yil:zaman.getFullYear(),
            ay:zaman.getMonth()+1,
            gun:zaman.getDate() 
        };
        response.end(JSON.stringify(tarih))
    } else if (urlObject.pathname == '/saat') {
        var saat={ 
            saat:zaman.getHours(),
            dakika:zaman.getMinutes(),
            saniye:zaman.getSeconds() 
        };
        response.end(JSON.stringify(saat))
    }
    else {
        response.writeHead(200, {"Content-Type": "text/html; charset=utf-8"});
        response.write("Ltfen saati ?renmek iin /saat ,")
        response.write("tarihi ?renmek iin /tarih adreslerini kullan?n?z.")
        response.end()
    }
})
server.listen(8080)
console.log("Server Ba?lat?ld?. Taray?c? zerinden http://localhost:8080"
           +" adresinden ula?abilirsiniz.")

8-4-node-server

Kodlar?m?z? inceledi?imiz zaman genel olarak bir nceki rnek ile ayn?. Farkl? taraf? callback fonksiyonu ierisindeki if yap?s?. Bir nceki rnekteki gibi gelen url bilgisini kontrol ederek i?lem yap?yoruz. E?er url /tarih ise tarih ad?nda bir nesne olu?turuyoruz. ?erisine yil, ay, gun de?i?kenlerini ve de?erlerini giriyoruz. Daha sonra JSON.stringify(…) ile nesnemizi jsona eviriyoruz ve response.end(…) ile dn?trm? oldu?umuz de?i?keni geri dndryoruz. Sonraki else if kod blo?unda url /saat ise yeni bir saat de?i?keni olu?turup ierisine saat, dakika, saniye de?i?kenleri ve de?erlerini yerle?tiriyoruz. Ve json nesnesine evirip kullan?c?ya dndryoruz. Ve son else blo?unda ise kullan?c? bu iki url d???nda herhangi bir?ey yazm??sa veya bo? b?rakm??sa kullan?c?ya bilgilendirme metni yolluyoruz. ?lk olarak response.writeHead(…) fonksiyonu ile yollayaca??m?z metnin trn ve kodlama standard?n? belirtiyoruz. Bu kodlar? eklemez isek Trke karakter problemi ya?ayabiliriz. Daha sonraki iki sat?rda response.write(…) fonksiyonu ile kullan?c?ya bilgilendirme yaz?s? yolluyoruz. ?stersek bunu tek sat?rda da yollayabiliriz. Son olarakta response.end() ile i?lemlerimizi bitirip kullan?c?ya yapt???m?z i?lemleri dndryoruz. ??te bu kadar. Art?k nceki blmdeki gibi ba?kalar?n?n kullanabilece?i bilgilendirici API servisleri yapabiliriz.

Bir sonraki blmde express framework kullan?m?na ba?layaca??z.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.


[jetpack_subscription_form]

NodeJS Ad?m 7 – HttpClient ve Events(Olaylar)

Ad?m Ad?m Nodejs yaz? dizimizinbir nceki blmndenpm yani nodejs package manager’dan ve paket ynetiminden bahsetmi?tik.

Hat?rlarsan?z daha nceki blmlerde de callback fonksiyonundan bahsetmi?tik. Callback fonksiyonu sayesinde asenkron i?lemlerin bitiminde yapmam?z gerekenleri belirtebiliyorduk. Peki asenkron i?lemler s?ras?nda bitmek olay? d???nda ba?ka olaylar meydana geldi?inde callback fonksiyonu gibi bir fonksiyonla o olay s?ras?nda yap?lmas? gereken i?lemleride belirtebilir miyiz? Tabikide yapabiliriz. nodejsin olaylar zelli?i sayesinde meydana gelen her olayda bir fonksiyon al??mas?n? sa?layabiliriz.

Bu blmde rnek olarak bir web sayfas?n? a??raca??z ve onun zerinde meydana gelen olaylara fonksiyon atayaca??z. Bunun iin kullanaca??m?z modl nodejsin kendi modl olan http modl. Bu modl sayesinde http protokol ile alakal? neredeyse her i?lemi yapabiliriz. Nodejsin en gl oldu?u yanlardan bir tanesi web. Bunu sa?layan en nemli paralardan bir taneside http modl. Nodejsin hem asenkron mimarisi, hem olay bazl? yap?s?, hemde http modl birle?ince nodejsin web zerinde leklenebilir web siteleri, web uygulamalar? ve api yazmak ok cazip hale geldi.

Http modln kullanan ilk rne?imiz ?u ?ekilde:

 

 var http = require("http")

http.get("http://www.emrekacan.net",function (response) {
    response.setEncoding('utf8')
    response.on('data',function (data) {
        console.log(data)
    })
})

7-1-node-httpclient

?lk sat?rda nodejsin global http modln a??r?p http de?i?kenine at?yoruz. Daha sonra http modlnn get fonksiyonu ile http://www.emrekacan.net adresine istekte bulunuyoruz. Yani sanki web taray?c?s?ndan girer gibi bu adrese http modlnn get metodu ile giriyoruz. ?stek i?leminin bitiminde de callback fonksiyonunu al??t?r?yoruz. Callback fonksiyonumuza tek parametre dnderiliyor. Oda response yani cevap de?i?keni. response de?i?keni ile yapm?? oldu?umuz iste?e verilecek cevap hakk?nda bilgi alabiliriz. Callback fonksiyonunun ilk sat?r?nda setEncoding ile yaz? format?m?z? uft8 olarak belirliyoruz. Yaz?lar?m?z bozuk ?kmas?n diye. Geldik as?l yere. response de?i?keninin on metodu ile bize gnderilecek cevap ile ilgili olaylar meydana geldi?inde i?lemler yapabiliriz. rne?imizde response.on(data,…) ?eklinde yazm?? oldu?umuz ifade ?u anlama geliyor: response de?i?keninde her data olay? gerekle?ti?inde ?u fonksiyonu al??t?r. data olay? nedir peki? Biz bir web adresine istekte bulundu?umuzda web adresi bize tek seferde teslim edilmez. Para para teslim edilir. ??te her bir para bize teslim edildi?inde data olay? al???r. Yani data olay? data teslim edildi olay?d?r. Buradaki callback fonksiyonu da her data teslim edildi?inde al???r ve bu datay? konsola yazar.

Burada ?yle bir soru gelebilir akl?n?za: E hani callback fonksiyonu dedi?imiz ?ey i?lem bitince al???yordu. http.get() fonksiyonunun callback fonksiyonuda web sayfas?n?n yklenmesi bitince al??mas? gerekmiyor mu? E?er bitince al???yorsa bitmi? bir?eyin data olay?na nas?l eri?iyoruz? ?yle cevaplayay?m. Siz bir taray?c? al??t?r?p adres blmne adresi yazd???n?zda sizin web sayfas? a??rma i?leminiz bitmi? oluyor. Daha sonra o web sayfas?n?n yklenme i?lemi ba?l?yor. Burada da ayn? mant?k var asl?nda. Siz http.get(…) fonksiyonunu kulland???n?zda bu fonksiyon belirtilen adresi a??r?yor. a??rma i?lemi bitiyor. Daha sonra sayfan?n yklenme i?lemi ba?l?yor. Bu s?rada da bizim http.get(…) fonksiyonuna yollam?? oldu?umuz callback fonksiyonu al???yor. Asl?nda http.get(…) fonksiyonunun callback fonksiyonuna yollanan response parametresi de ba?layan bu yklenme i?lemi zaten. Bu sayede yklenme i?leminin data fonksiyonuna eri?ebiliyoruz.

Peki bu responseun ba?ka olaylar? yok mu? Tabiki var. Bi rnek daha yapal?m:

 

var http = require("http")

http.get(process.argv[2], function (response) {
    response.setEncoding('utf8')
    response.on('data', function (data) {
        console.log(data)
    })
    response.on('end', function () {
        console.log('Yklenme i?lemi bitti.')
    })
    response.on('error', function (hata) {
        console.log('Yklenme s?ras?nda bir hata olu?tu:' + hata.message)
    })
})
.on('error', function (hata) {
    console.log("Web adresinin a?lmas? s?ras?nda bir hata olu?tu." + hata.message)
})

7-2-node-httpclient

Bu rnek bir nceki rnekle hemen hemen ayn?. Bu rnekte web adresini konsoldan parametre olarak al?yoruz. Ek olarakta iki tane daha olay ekledim. Birisi end olay?. Ad?nda anla??laca?? zere ykleme i?lemi bitti?inde tetiklenen olayd?r. Di?eri ise error olay?. Buda herhangi bir hata oldu?unda tetiklenen bir olayd?r. En altta http.get(…) fonksiyonunun d???nda bir olay daha var. Oda error olay?. Buda herhangi bir hata an?nda tetiklenen bir olay. Peki iki error olay?n?n fark? ne? Asl?nda yaz?ld?klar? yerlere bak?nca fark? anlayabiliriz. http.get(…) fonksiyonunun ierisine yani responsea yaz?lan error olay? ykleme s?ras?nda bir hata olu?tu?unda tetiklenir. http.get(…) fonksiyonunun d???na yaz?lan error olay? ise istek s?ras?nda herhangi bir hata olu?ursa tetiklenecek olayd?r.

Olaylar yard?m? ile bir web adresine istekte bulunup cevab? almay? grdk. Peki bu bizim ne i?imize yarayacak? Gelen html ieri?i xml parser aralar? yard?m? ile parse edebilirsiniz yani ay?klayabilirsiniz ve ierisinde i?inize yarayabilecek verileri alabilirsiniz. Ya da belirli srelerde web sitelerinin ar?ivini yapmak isteyebilirsiniz. Bunlar gibi ?eyler yap?labilir ama en mant?kl?s? APIlar? kullanmakt?r. APIlar yine http protokol ile al??an URLler zerinden ula?abildi?imiz bize daha net bilgi veren json veya xml format?nda kullan?labilen web servisleridir. rne?in hava durumunu bize sunan bir API d?nn. Siz URLinizi yaz?yorsunuz, nerenin hava durumunu ?renmek istedi?inizi yaz?yorsunuz ve size k?sa bir json nesnesi dnyor. Sizde ano al?p i?liyorsunuz. Bu kadar. ??te bu basit bir API rne?i. Bizde rne?imizde bunu kullanaca??z. Di?er rne?imize geelim.

Bu rnekte openweathermap.org sitesinin API lar?n? kullanaca??z. Belirli bir s?n?ra kadar cretsiz. rnek iin yeterli. Bunun siteye ye olman?z gerekiyor. ye olduktan sonra API Keys blmnden yeni bir API Key olu?turabilir veya varolan API Keyi kullanabilirsiniz.

7-4-httpclient

Tabi bu APIlerin nas?l kullan?laca??n? dokmantasyonundan ?reniyoruz. Dokmantasyonu inceledi?imizde belirtilen yerin ?uan ki hava durumunu ?renmek iin ?yle bir URL yeterli olacakt?r : http://api.openweathermap.org/data/2.5/weather?q=YER&appid=APIKEY . YER yerine Ankara, ?stanbul, Kayseri gibi bir yer ismi, APIKEY yerinede olu?turmu? oldu?unuz API Keylerden bir tanesini yerle?tirin. Bunu herhangi bir taray?c?dan al??t?rd???n?zda size JSON bir de?er dnderecektir. ??te biz bu JSON nesneyi Kullanaca??z. Bir sonraki rnekte Konsoldan il ad?n? al?p ekrana hava durumu sonucunu yazan bir uygulama yapaca??z. Kodlar?m?za geelim:

 

var http = require("http")

http.get('http://api.openweathermap.org/data/2.5/weather?q=' + process.argv[2] + 
'&units=metric&appid=02583a7bfd3cd5d870c5fa483017fd61', function (response) {
    response.setEncoding('utf8')

    var sonuc = '';

    response.on('data', function (data) {
        sonuc = sonuc + data;
    })
    response.on('end', function () {
        var jsonSonuc = JSON.parse(sonuc);
        console.log(jsonSonuc.main.temp)
    })
    response.on('error', function (hata) {
        console.log('Yklenme s?ras?nda bir hata olu?tu:' + hata.message)
    })
})
.on('error', function (hata) {
    console.log("A?lma s?ras?nda bir hata olu?tu." + hata.message)
})

7-3-node-httpclient

?nceleyecek olursak ilk sat?r http modlnn a??r?larak http de?i?kenine at?yoruz. Bir sonraki sat?rda http.get(…) fonksiyonuna API?n URLini yaz?yoruz. URL ierisindeki process.argv[2] blmnde ise konsoldan ald?d???m?z il ad?n? URL ierisine ekliyoruz. URLin sonundaki appid blmndeki Key alan?n? siz kendi keyiniz ile de?i?tirin. Daha sonra callback fonksiyonumuz al???yor. Callback fonksiyonu ierisinde sonuc isminde bir de?i?ken olu?turdum. Daha sonra data olay?nda gelen datalar? srekli olarak sonuc de?i?kenine ekledim. (Normalde ok k?sa bir cevap oldu?u iin tek seferde geliyor. Ama nlem olarak de?i?kene atmak faydal?.) end olay?nda ise elde etti?im sonuc de?i?kenini JSONa dn?trdm ve jsonSonuc de?i?kenine att?m. Son olarakta ekrana jsonSonuc nesnesinin main.temp de?erini yazd?rd?m. Hava durumu sonucunun main.temp ierisinde oldu?unu nerden biliyorum? Tabiki dokmantasyondan. Onun d???nda API URLini taray?c? zerinden al??t?rarak da bakabilirsiniz. ??te bu kadar. Art?k konsol zerinden hava durumu ?renebilece?imiz bir program?m?z var.

HttpClient ve Olaylar konumuzda bu kadar. Bu blmde bir web sayfas?n? nas?l a??rabilece?imizi, a??rd?ktan sonra yklenme i?lemine nas?l eri?ebilece?imizi ve bu yklenme i?lemindeki olaylara nas?l eri?ebilece?imizi grdk.

Bir sonraki blmde kendi web sayfalar?m?z? nas?l yapabilece?imizi grece?iz.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.


[jetpack_subscription_form]

NodeJS Ad?m 6 – Npm paket yneticisi

Ad?m Ad?m Nodejs yaz? dizimizinbir nceki blmnde modl olu?turmay? ve bunlar? kullanmay? ?rendik.

Amac?m?z srekli ayn? kodlar? yazmamak ve tekrar kullan?labilir program paralar? retmekti. Peki yazd???m?z bu modlleri ba?kalar?n?n kullanmas?n? sa?layabilir miyiz? Yada ba?kalar?n?n yazd??? modlleri biz kullanabilir miyiz? Yada kulland?k diyelim. Daha sonra bu modln sahibi paketi gncelledi?inde kolayca gncelleyebilir miyiz? (Bu arada paketi modln paketlenmi? kullan?ma haz?r hali gibi d?nebilirsiniz. Asl?nda ayn? ?eyler.)

Tabiki. Bunu npm yani node package manager ile ok kolay bir ?ekilde yapabiliriz. npm nodejsi ykledi?imizde yklenen bir ara. npm ile olu?turmu? oldu?umuz modlleri ba?kalar?n?n kullanmas? iin yay?nlayabiliriz. npm resmi olarak https://www.npmjs.com adresini kullan?r. Yay?nlam?? oldu?umuz paketlere herkes bu adresten eri?ebilir. Yine npm ile herkesin a?k olarak yay?nlad??? paketlere bizde buradan ula?abiliriz. Ben bu yaz?y? yazarken toplam paket say?s? 330338 adet idi. Paket yay?nlamaya ok girmeyece?im. Gerekli dokmantasyona buradan ula?abilirsiniz.

npm ile Paket Ykleme

npm tamamen konsol zerinden kullan?lan bir ara. npm ile tm i?lerimizi konsol komutlar? ile yapaca??z. Paket yklemek iin kullanaca??m?z komut ise ?u ?ekilde: npm install paketadi. Bu komut ile npm zerindeki btn paketlere ula?abiliriz. Tabi bu paketlerin ne i?e yarad?klar? ve nas?l kullan?ld?klar?n? paketlerin dkmantasyonundan ?renece?iz. rnek olarak lodash paketini ykleyelim. Bunun iin konsol ekran?na npm install lodashyazmam?z yeterli. Bu komut npmnin deposundan lodash paketini bizim iin indirecektir. Peki ama nereye ykleyecek? npm ile ykledi?imiz paketler bulundu?umuz klasr ierisindeki node_modules ad?ndaki bir klasre yklenir.(Klasr yoksa olu?turulur.) Bu paketleri kod ierisinde nodejsin var olan paketleri gibi kullanabiliriz. rne?in lodash paketini kullanmak iin var ldsh=require(“lodash”);yazmam?z yeterli. Nodejs bu paketi node_modules klasr ierinde bulup ldsh de?i?kenine atacakt?r. Lodash ierisinde btn nesne ve fonksiyonlar?da ldsh de?i?keni ile eri?ebilir.

6-1-node-npm

?lk paketimizi yklemi? olduk. Asl?nda npm ile sadece nodejs paketleri yklemiyoruz.Nodejs paketleri d???nda css paketleri, javascript paketleri(n yz geli?tirme iin) gibi paketlerde ykleyebiliriz. Mesela bootstrap css frameworkn npm ile ykleyebiliriz. Bunun iin ?u komutu vermemiz yeterli npm install bootstrap. Ayn? ?ekilde jquery javascript ktphanesini yklemek istiyorsak ?u komutu vermemiz yeterlidir: npm install jquery. npmnin bir di?er yetene?i de yklemek istedi?imiz paketlerin istedi?imiz versiyonunu ykleyebiliyor olmam?z. Mesela jquerynin 1.11.2 versiyonunu yklemek istiyorsak ?u komut bizim iin yeterli olacakt?r: npm install jquery@1.11.2.Gemi? versiyonlar gibi alfa veya beta versiyonlar iinde ykleme yapabiliriz. Btn bu versiyonlar tabiki paket sahibi taraf?ndan belirleniyor. Ykleyece?imiz paketin al??mas? iin ba?ka bir paket yklenmesi gerekiyorsa npm bizim iin onlar? da yklyor. Mesela jquery validationpaketinin al??mas? iin jquery paketininde yklenmesi gerekiyor. Siz npm install jquery-validation komutunu al??t?rd???n?zdanpm jquery validation paketiyleberaber jquery paketini zaten yklemi? oluyor.

package.json Dosyas? ve Maharetleri

Peki bizim projemiz iin toplam paket say?s? 50yi geti diyelim. O zaman bizim projemizin boyutu ok ykselece?i iin ta??nabilirli?i d?ecektir. Projeyi i? arkada??m?za verece?iz diyelim. 50 paketin hepsiyle beraber kopyalay?p verece?iz. Yada diyelimki kodlar?m?z? versiyon kontrol sistemine yklyoruz. Ve srekli versiyonlama yap?yoruz. Ykleme ve versiyonlaman?n tamam? 50 paket ile birlikte olacak. Buda ok zaman alacakt?r. Bu i?in kolay bir yolu yok mu? Tabiki var. package.json dosyas?.

package.json dosyas? projemizin ana dizininde bulunan ve projemiz hakk?nda bilgiler ieren, projemiz ierisinde kullan?lan paketlerin listesini tutan, projemiz iin konsolda kullan?labilecek komutlar iin k?sa yollar eklenebilen ve daha fazlas?n? ieren zel bir json dosyas?d?r. rnek bir package.json dosyas? ?u ?ekildedir:

{
  "name": "proje_adi",
  "version": "1.0.0",
  "keywords": [
    "nodejs",
    "npm",
    "ders",
    "ornek"
  ],
  "description": "proje a?klamas?",
  "main": "program.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Emre KAAN",
  "license": "MIT",
  "dependencies": {
    "bootstrap": "^3.3.7",
    "jquery-ui": "^1.12.0",
    "lodash": "^4.15.0"
  }
}

Dosyam?z?n ieri?ine bakacak olursak name alan? projemizin ad?, version alan? projemizin ?uan hangi versiyonda oldu?u, keywords alan? projemiz hakk?ndaki anahtar kelimeleri, description alan? projemiz hakk?nda a?klama, main alan? projemizi al??t?rmaya hangi dosyadan ba?lanaca??n?, scripts projemiz iin konsolda al??t?rabilece?imiz komutlar?n k?saltmalar?, author alan? proje yazar?/sahibi, license proje lisans? ve son olarak da dependencies projemizin ba??ml?l?klar? yani projemizde kulland???m?z paketlerin listesi hakk?nda bilgi verir.

Projemizin ana dizinine bir dosya olu?turup ad?na package uzant?s?na da .json vererek bu dosyay? olu?turabiliriz. ?eri?ini yukardaki gibi kendimiz yazabiliriz. Ama bunun daha kolay bir yolu var. konsoldan ?u komutu vermemiz yeterli npm init . Bu komutu verdi?imizde bize birka soru sorulacak ve sorular bitti?inde dosya kendisi olu?acak. Daha nceden yklemi? oldu?unuz paketler varsa onlar?da dependecies yani ba??ml?l?klar yani paket listesine ekleyecektir. Soru sorular?n hepsine cevap vermek zorunda de?ilsiniz. Hibirine cevap vermeyip sadece paketleri alg?lamas?n? sa?layabilirisiniz.

6-2-node-npm

Dosyam?z? olu?turuk. Bu dosya projemiz hakk?nda bir ok bilgi bar?nd?r?yor. En nemliside paket listesi. Art?k projemizi ta??rken node_modules klasrn silebiliriz. Yada projemizi versiyon kontrol sistemlerine atarken node_modules klasrn hari tutabiliriz(exclude). Peki ama projeyi alan ba?ka bir ki?i paketleri tekrar nas?l ykleyecek? ok basit ?u komutla: npm install . Biz bu komutu konsola yazd???m?zda npm package.json dosyas?na bakacak ve ierisindeki paketleri ykleyecek. zellikle github zerinden indirdi?iniz veya checkout yapt???n?z projelerin o?unda projeyi al??t?rmadan nce bu komutu vermeniz gerekir.

package.json ierisindeki scripts k?sm? iin projemiz iin konsolda kullanaca??m?z komutlar?n listesini tutabiliriz demi?tik. Mesela program?m?z? konsolda al??t?rmak iin node program.js komutunu veriyorduk. Bunu package.json ierindeki script k?sm?na ekleyelim.

 

{
  ...
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node program.js"
  },
  ...
}

Art?k projemizi npm ile ba?latabiliriz. Konsola ?u komutu vermemiz yeterli :npm start

Bir scripte birden fazla komutta yazabiliriz. package.json dosyam?z? ?u ?ekilde de?i?tirelim:

 

{
  ...
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "npm install && node program.js"
  },
  ...
}

Konsola tekrar npm startyazd???m?zda npm nce npm installkomutunu al??t?r?p paketleri ykleyecek, daha sonra node program.jskomutunu al??t?r?p program? al??t?racak.

npm ile ilgili syleyeceklerimiz bu kadar de?il ama ilk a?ama iin bu kadar yeterli san?r?m. Gerisini ke?fetmek size kalm??.

npm ile Global Paketler ve Kk Aralar

npm ile paket yklemek bu kadar kolayken bu kolayl??? ba?ka yerlerde kullanmamak olmazd?. npm ile konsolda kullanabilece?imiz kk aralarda ykleyebiliriz. Mesela resimlerinizi yeniden boyutland?ran bir konsol arac? d?nn. Siz arac?n ad?n? yaz?yorsunuz, resmin ad?n? yaz?yorsunuz, boyutu yaz?yorsunuz ve o ara sizin iin o resmin boyutunu bytyor veya kltyor. Byk kolayl?k. Tek sat?r komut ile i?imizi halletmi? oluyoruz. Bunun iin npm bize yeter. Ama npm ykledi?i paketleri node_modules klasrne at?yordu. Oradaki bir ara nas?l olacakta konsolda al???r hale gelecek? Tabiki oraya yklemeyerek. npm ile istedi?imiz paketleri global olarak ykleyebilir. Mesela yukar?da bahsetti?im rnek iin paketimizin ad? resize-img-cli. resize-img-cli paketini global olarak yklemek iin konsola ?u komutu vermemiz yeterli: npm install –global resize-img-cli. Yada npm install -g resize-img-cli. ?ki komutta ayn?. Bu komut ile resize-img-clipaketini bilgisayar?m?zda bulunan global npm deposuna yklyor. Ve biz resize-img-cli paketini konsol zerinden istedi?imiz gibi kullanabiliyoruz. Mesela resize-img-cli ile bir resmin boyutunu de?i?tirmek iin resize-img-cli resim1.jpg –width 200 > resim2.jpgkomutunu al??t?rmam?z yeterlidir. Bu komut npmnin global deposundaki resize-img-cli arac?n? al??t?racak ve parametre olarak verdi?imiz resim1.jpg dosyas?n? alacak ve boyutunu de?i?tirip resim2.jpg ad?nda yeniden kaydedecek. (Bu arac? kullanmay? tabiki dokmantasyonundan ?reniyoruz.) Bu kadar.

6-3-npm

Paket yklemeyi ve global paketlerle kk aralar kullanmay? bu kadar kolayla?t?rd??? iin npmnin ?uan yzbinlerce paketi var. Ve ok popler olarak kullan?lmakta. ?nsanlar nodejs kullanmasa bile npmyi bir ?ekilde kullan?yorlar. nk npm aralar? sadece nodejs de?il nodejs d???nda birok i?e yar?yor. Birka rnek vermek gerekirse yeoman paketi ile proje taslaklar? olu?turabilirsiniz, gulp paketi ile projenizde yapt???n?z srekli grevleri otomatize edebilir, less paketi ile .less dosyalar?n?z? derleyebilirsiniz gibi daha birok kk aralar i?leriniz kolayca halledebilirsiniz.

npm ile anlat?labilecekler tabiki bu kadar de?il. Ama bunlar san?r?m yeterli olacakt?r. Daha fazla bilgi ve paket iin npmjs.com adresine bakabilirsiniz.

Bir sonrakiblmde nodejse geri dnp httpClient ile web sitelerine ve servislerine ba?lanmay? ve olaylar? anlataca??m.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.


[jetpack_subscription_form]

NodeJS Ad?m 5 – Modler Programlama

Ad?m Ad?m Nodejs yaz? dizimizin bir nceki blmndeasenkron programlamadan ve callback fonksiyonundan bahsettik. Bu blmde de Modler Programlama ile devam edece?iz.

Program yazarken kodlar?m?z bazen 10 bazen 100 bazen 1000 bazen binlerce sat?ra ula?abilir. Bydke de ynetimi zor iinden ?k?lmaz bir hale gelir. Ve zaman zaman ayn? kodlar? srekli srekli yazar?z. Bunu nlemek iin srekli srekli yazd???m?z kodlar? fonksiyonlara ta??r?z. Ama kodlar?m?z ok oldu?unda buda yetersiz gelir. Tekrarlayan fonksiyonlar ortaya ?kabilir. Bu seferde fonksiyonlar ok fazla olur ve onlar ynetilemez, iinden ?k?lamaz bir hale gelir. Bunu nlemek iinde ayn? amaca hizmet eden fonksiyonlar? ayr? ayr? dosyalarda birle?tiririz. rne?in I/O i?lemeleri iin yaz?lm?? fonksiyonlar? bir dosyada toplayabiliriz. o?u zaman yeterli olsa da programlar?m?z bymeye devam ettike dosyalar?nda ynetimi zorla?abilir. Yzlerce dosyay? grupland?r?p ynetmek kolay olmayabilir. Bu sorunu da zmek iin belirli amaca hizmet eden dosyalardan olu?an dosya gruplar? olu?tururuz.

Yazd???m?z kodlar? ynetilebilir hale getirmek, kod karma?as?n? ortadan kald?rmak ve tekrar kullan?labilir kodlar olu?turmak iin mant?ksal olarak ayn? i?leri yapan kod veya dosyalar?n bir araya getirilerek olu?turuldu?u, tek ba??na al??amayan ana programlar taraf?ndan kullan?larak al??t?r?lan program paralar?na modl(yada ktphane yada paket) denir. nodejs zerinde kullan?lan bir ok modl bulunmaktad?r. Bunlardan baz?lar? nodejs al???rken otomatik yklenir(daha nce kulland???m?z process gibi) baz?lar?n? da kodlama s?ras?nda kodlar yard?m? ile biz ykleriz(daha nce kulland???m?z fs modl gibi).

Modln ne oldu?unu ?rendi?imize gre art?k kendi modllerimizi nas?l yazaca??m?za bakal?m. Bu blmn ilk rne?inde ayr? bir dosyaya kendi modlmz yaz?p ana dosyam?z ierisinde onu nas?l kullanabilece?imize bakaca??z. ?lk olarak modlmz yazal?m ve modul1.js isimli bir dosyaya kaydedelim. Kodlar?m?z ?u ?ekilde :

 

var fs = require('fs');

module.exports = function (dosyaAdi, callback) {
    var dosyaIcerigi = fs.readFile(dosyaAdi, function (hata, data) {
        if (hata) {
            return callback(hata);
        }
        callback(null, data.toString());
    })
}

Basit bir modl yazd?k. Bu modlde modle yollanan dosya ismine gre dosya okuyup ieri?ini geri gnderiyoruz. Ad?m ad?m bakacak olursak ilk sat?rda fs modln a??rd?k. Daha sonra module.exports = function(…) kodlar? ile dosyam?z? bir modle evirmi? olduk. Bu kodlar sayesinde bu dosyay? a??ran her program yazm?? oldu?umuz modl bir fonksiyon olarak kullanabilecek. Modl fonksiyonunun ieri?ine bakacak olursak parametre olarak iki de?er al?yor. Birincisi dosyaAdi ad?nda bir de?i?ken. Bu de?i?kene modl kullanan program bir dosya ad? yollayacak. Bizde bunu fonksiyon ierisinde kullanaca??z. ?kinci olarakta callback ad?nda bir de?i?ken al?yor. Evet gelelim en nemli noktalardan birisine. Modller do?as? gere?i asenkron al???rlar. Asenkron al??an her fonksiyonun bir callback fonksiyonu olacak ki i?i ne zaman bitmi?se bilelim ve yollam?? oldu?umuz callback al??s?n. Bizim modlmzde asenkron ve bizde i?imiz bitti?inde bunu kullan?c?ya bildirmeliyiz. Bunun iinde bize bir calllback yollanmal? ve bunu program sonunda al??t?rmal?y?z. callback de?i?keni bunun iin var.

Fonksiyonumuz ierisinde fs modl ierisindeki readFile fonksiyonu ile bize yollanan dosyaAdi de?i?keni ierisindeki dosyay? okuyoruz. readFile?n callback fonksiyonu ierisinde ilk olarak hata kontrol yap?yoruz. e?er hata varsa bize yollanan callback de?i?keninin ilk parametresine veriyoruz ve geri dnderiyoruz. Buras? biraz garip gelebilir. Evet callback bir de?i?ken ama sonuta bize bir fonksiyon yollanacak. Yani callback tr fonksiyon olan bir de?i?ken. Bu yzden biz onu fonksiyon olarak kullanabiliriz. Devam edelim. E?er hata yoksa kodlar?m?z devam edecek. Bir sonraki sat?rda callback de?i?keninin ilk parametresine null, ikinci parametresine okumu? oldu?umuz dosyan?n ieri?ini stringe evirip veriyoruz. callback fonksiyonunun ilk parametresine null yani bo? de?er yollad?k. nk ilk parametre hata iin kullan?ld?. Biz yine de ilk parametreye yollayabilirdik. Hata olu?mazd?. Ama kullan?c? ilk parametreden gelen de?erin hata m? yoksa dosya ieri?imi oldu?unu anlayamazd?. Baz? ?eyler biraz havada kalm?? olabilir ama modlmz kullan?rken her ?ey daha da netle?ecek. Gelelim modlmz kullanmaya. program.js dosyas?ndaki kodlar?m?z ?u ?ekilde:

 

var m1=require('./modul1');

m1(process.argv[2],function (hata,data) {
    if (hata) {
        console.log("Bir hata olu?tu.");
        return;
    }
    console.log(data);
});


5-1-node-module

?lk sat?rda yazm?? oldu?umuz modl a??r?p m1 de?i?kenine atad?k. Bizim modlmz tek bir fonksiyondan olu?uyor. Dolay?s?yla m1 de?i?keninin tr asl?nda bir fonksiyon. Yani biz m1 de?i?kenini bir fonksiyon gibi kullanaca??z. Kodlar?m?za devam edelim. Modlmzn ilk de?i?keni okuyaca??m?z dosyan?n ismiydi. Biz dosya ismini konsoldan parametre olarak alaca??z. Alm?? oldu?umuz bu parametreyi de m1 de?i?kenine yani modlmzn ilk parametresine verece?iz. ?kinci parametre olarakta bir fonksiyon yaz?yoruz. Bu fonksiyon bizim modlmzdeki callback de?i?kenine denk geliyor. Yani modlmzn i?i bitti?inde yada hata oldu?unda bu fonksiyon al??acak. (Modlmz hat?rlay?n.). Bu fonksiyonda ilk olarak hata kontol yapt?k. Daha sonra gelen data de?i?kenini console ekran?na yazd?rd?k. Evet kodlar?m?z bu kadar. Daha iyi anla??lmas? iin modul1.js dosyas?n? ve program.js dosyalar?n? yan yana koyarak inceleyebilirsiniz. Tabi ?u noktada ok nemli. Bizim modlmzn ne i?e yarad???, yada callback fonksiyonunun yap?s?n?n nas?l oldu?u gibi bilgileri bizden ba?ka kimse bilemez. Bunun iin her haz?rlad???m?z modln bir dokmantasyonu olmal?. Ki modl kullanacaklar bilsin. Sadece biz kullanacak olsak bile aradan zaman geince unutabiliriz.

Peki fs modlnde oldu?u gibi ierisinde birden fazla fonksiyon olan bir modl nas?l haz?rlar?z. ?kinci rne?imizde Matematik ad?nda bir modl yapaca??z. Modlmzn 4 tane fonksiyonu olacak : Topla, ?kar, arp, Bl. Matematik.js dosyas? ?u ?ekilde:

 

var Mat = function () { };

Mat.prototype.Topla = function (a, b) {
    return Number(a) + Number(b);
}

Mat.prototype.Cikar = function (a, b) {
    return Number(a) - Number(b);
}

Mat.prototype.Carp = function (a, b) {
    return Number(a) * Number(b);
}

Mat.prototype.Bol = function (a, b) {
    return Number(a) / Number(b);
}

module.exports = new Mat();

Kodlar?m?za bakacak olursak Mat ad?nda bir javascript s?n?f? olu?turduk. Bu nesneye Topla, Cikar, Carp, Bol ad?nda 4 tane fonksiyon olu?turduk. Fonksiyon ierikleri basit. Tek dikkat edilecek nokta Number() kullan?m?. Bunu fonksiyonu kullanma sebebimiz fonksiyona yollanan parametreleri say?ya evirmek. Aksi halde javascript hata vermez ama i?lem sonucu yanl?? olur. En son sat?rda da olu?turmu? oldu?umuz Mat s?n?f?n?n bir nesnesini modl olarak atad?k. Gelelim modlmz kullanmaya. program.js kodlar? ?u ?ekilde:

 

var m1 = require('./Matematik');

var t1 = m1.Topla(process.argv[2], process.argv[3]);

var t2 = m1.Cikar(t1, process.argv[4]);

var t3 = m1.Carp(t2, process.argv[5]);

var t4 = m1.Bol(t3, process.argv[6]);

console.log(t1, t2, t3, t4);

5-2-node-module

?lk sat?rda Matematik modlmz a??rd?k. Daha sonraki 4 sat?rda konsoldan ald???m?z parametreleri kullanarak 4 i?lem yapt?k. Her birinin sonucunu de?i?kenlere atad?k. En son sat?rda da bu sonular?n tamam?n? konsol ekran?na yazd?rd?k. Kodlar?m?z bu kadar. Dikkat ettiyseniz modlmz ierisindeki fonksiyonlar asenkron de?iller. Biz kodlar?m?z ierisinde herhangi bir asenkron i?lem yapmad???m?z iin kodlar?m?zda asenkron olmad?. nceki rnekte modlmz ierisinde asenkron bir fonksiyon kullanm??t?k. Bu nedenle modlmz asenkron olmu?tu.

Evet, bu blmde modl olu?turmay? ve olu?turmu? oldu?umuz modlleri kullanmay? grdk. Asl?nda 5 farkl? modl olu?turma yntemi var. Biz burada ikisini grdk. Bunlar i?imizi rahatl?kla grecektir.

Bir sonrakiblmde bu modlleri daha etkili bir ?ekilde nas?l kullanabilece?imize bakaca??z.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.


[jetpack_subscription_form]

NodeJS Ad?m 4 – Asenkron Programlama

Ad?m Ad?m Nodejs yaz? dizimizin bir nceki blmnde I/O i?lemlerinden yani dosya okuma yazma i?lemlerinden bahsettik. Bu blmde senkron ve asenkron programlamay? anlataca??m.

Senkron Programlama

Yazd???m?z programlar?n o?u yazm?? oldu?umuz kodlar? yaz?l?? s?ras?na gre yukar?dan a?a??ya do?ru i?leyerek ilerler. Her ?ey s?ra ile yap?l?r. rne?in bir nceki blmde yazm?? oldu?umuz ?u kod buna bir rnektir:

var fs=require("fs");
var dosyaIcerigi=fs.readFileSync(process.argv[2]);
console.log(Program devam ediyor...);
var satirlar=dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);

5 sat?rda s?ras?yla i?ler: fs modln a??r, dosya ieri?ini al, ekrana Program devam ediyor… yaz, sat?rlar? hesapla, sat?r say?s?n? ekrana yaz. Hibir i?lem birbirinin nne geemez. Ve birbirini beklemek zorundad?r. S?rayla, senkron bir ?ekilde i?lemek zorundad?r. Bu tip programlama metoduna Senkron Programlama denir.

Asenkron Programlama

Senkron programlamadaki her ?eyi s?rayla i?lemesi ve her bir i?lemin birbirini beklemesi yeri geldi?inde program?m?z? ok yava?latabilir, hatta i?lem bitene kadar durdurabilir. rne?in yukar?daki kodda 3. sat?r bir nceki sat?r? yani dosya okuma i?lemini beklemek zorundad?r. Dosya ieri?i ok bykse bu i?lemler dakikalar bile alabilir. Ekrana Program devam ediyor… yazd?rmak iin bir nceki i?lemin bitmesini beklemek pek ak?ll?ca de?il. ??te bu tip durumlar iin asenkron fonksiyonlar kullan?r?z. Kod ak???n?n s?rayla i?lemedi?i, i?lemlerin birbirini beklemedi?i, kod ak???n?n i?lem durumlar?na gre devam etti?i programlamaya Asenkron Programlama denir.

4-0-node-async

Asenkron i?lemler iin modller ierisinde asenkron fonksiyonlar vard?r. rne?in fs modl ierisinde kullanm?? oldu?umuz readFileSync metodunun asenkron versiyonu readFile metodudur. Yukar?daki rne?imiz bu metot ile yeniden yazal?m.

var fs=require("fs");
var dosyaIcerigi=fs.readFile(process.argv[2]);
console.log(Program devam ediyor...)
var satirlar=dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);

 

4-1-node-async

Bu ?ekilde kodlar?m?z? asenkron yapm?? olduk. Art?k 2. sat?rdaki i?lem al???rken 3,4 ve 5 sat?rlar onun sonucunu beklemeden devam eder. Ancak yukar?daki kodlar?m?z hata verecek. Neden? nk biz 4. sat?rda 2. sat?rdaki kodun sonucunu kullan?yoruz. Ama daha 2. sat?rdaki kodun i?i bitmedi.(E?er okunan dosya ok ok kkse kk bir ihtimal bitmi? olabilir.) Peki biz ikinci sat?rdaki kodun i?inin bitti?ini nereden anlayaca??z? Bittikten sonra yapmam?z gerekenleri nerede belirtece?iz? Callback fonksiyonunda.

Callback fonksiyonu

Asenkron fonksiyonlar ierisindeki i?lemler bittikten hemen sonra yap?lacaklar?n belirlendi?i metotlara callback metotlar? denir. Bu metotlar asenkron metotlara parametre olarak verilir. Sadece bitiminde de?il herhangi bir hata sonucunda da callback fonksiyonlar? kullan?labilir. Bu tamamen asenkron metodun yap?s?yla alakal?d?r. Nodejs ierisindeki callback fonksiyonlar?nda genellikle en az iki tane parametre belirlenir. Biri hata durumunu kontrol etmek iin, di?eri fonksiyon sonucunu almak iin kullan?l?r. Callback fonksiyonunun ka tane parametre ald???n?, yap?s?n?n nas?l oldu?unu, hangisi s?ra ile yaz?laca??n? vs bilgileri kullanaca??m?z modl ve fonksiyonun dokmantasyonundan ?renebiliriz. Nodejs ierisindeki resmi modllerin dokmandasyonuna https://nodejs.org/en/docs/ adresinden kulland???n?z nodejs versiyonuna gre ula?abilirsiniz. rne?in fs modl ierisindeki readFile metodunun dokmantasyonuna buradan ula?abilirsiniz.

Gelelim kullan?m?na. Yukar?daki kodu ?u ?ekilde dzenliyoruz:

var fs=require("fs");

var callback1 = function (hata,dosyaIcerigi) {
if (hata) {
console.log("Bir hata olu?tu.")
return;
}
var satirlar=dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);
}

fs.readFile(process.argv[2],callback1);
console.log("Program devam ediyor...");

4-2-node-async

Kodlar?m?za bakacak olursak callback1 ad?nda bir fonksiyon olu?turduk. Bu fonksiyon iki tane parametre al?yor. (Yap?s?n? tabiki dokmantasyondan ?rendik.) Bu fonksiyonu readFile fonksiyonuna parametre olarak verdik. readFile i?lemlerini yapt?ktan sonra bizim vermi? oldu?umuz callback1 fonksiyonunu ilk parametre olarak varsa hatay?, ikinci parametre olarak da hata olu?mam??sa sonucu parametre olarak verecek ve al??t?racak.

Kodumuza genel olarak tekrar bakarsak, ilk sat?rda fs modln a??rd?k. ikindi sat?rda parametre olarak yollad???m?z dosyan?n ieri?ini okumaya ba?lad?k. 2. Sat?rdaki kodumuz devam ederken 3. sat?rda ekrana Program devam ediyor yazd?k. Di?er taraftan 2. sat?rdaki kod ne zaman biterse callback1 fonksiyonunu a??racak. callback1 fonksiyonu ierisinde de ilk olarak hata olup olmad???n? kontrol ettik. Varsa konsol ekran?na Bir hata olu?tu. yazd?rd?k ve program? bitirdik. Yoksa devam edecek. Devam ederse dosyaIcerigi degiskenini string ifadeye evirip sat?rlar?na ay?rd?k. Daha sonrada sat?r say?s?n? ekrana yazd?rd?k. Genel olarak program?m?z bu ?ekilde i?liyor. Ayn? program? ?u ?ekilde de yazabiliriz:

var fs = require("fs");

fs.readFile(process.argv[2], function (hata, dosyaIcerigi) {
if (hata) {
console.log("Bir hata olu?tu.")
return;
}
var satirlar = dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);
});

console.log("Program devam ediyor...");

nceki kod ile bu kod aras?nda hibir fark yok. Sadece yaz?m ?ekli farkl?. ?lkinde callback fonksiyonunu bir de?i?kene atay?p yle readFile fonksiyonuna ilettik. Di?erinde direkt ierisine yazd?k. Hangisi kolay?n?za geliyorsa kullanabilirsiniz. ?kisinin aras?ndaki fark? daha iyi anlamak iin iki kodu yan yana koyup inceleyebilirsiniz. Javascript ve nodejs dnyas?nda ikinci kullan?m daha yayg?nd?r. Kullanmasan?z bile kod okurken ikincisini anlamak faydal? olacakt?r.

Gelelim ikinci rne?imize. ?kinci bir rnek olarakta dosyan?n birinden okudu?umuz ieri?i ikinci bir dosyaya yazaca??z. Tabi iki dosya isminide parametre olarak alaca??z. Okuma i?lemi iin daha nce kulland???m?z fs modlnn readFile fonksiyonunu, yazma i?lemi iinde fs modlnn writeFile fonksiyonunu kullanaca??z. writeFile fonksiyonuda readFile gibi asenkron bir fonksiyon. (Daha nce kulland???m?z writeFileSync fonksiyonunun asenkron versiyonu.) Hem okuma hem yazma i?lemlerimiz asenkron olacak. Kodumuz ?yle:

 

var fs=require("fs");

var callback1 = function (hata,dosyaIcerigi) {
    if (hata) {
        console.log("Bir hata olu?tu.")
        return;
    }
    fs.writeFile(process.argv[3], dosyaIcerigi, callback2);
    console.log("Dosya okuma i?lemi bitti.");
}

var callback2=function (hata) {
    if (hata) {
        console.log("Bir hata olu?tu.")
        return;
    }
    console.log("Dosya yazma i?lemi bitti.")
}

fs.readFile(process.argv[2],callback1);
console.log("Program devam ediyor...");

4-3-node-async

Kodumuzun ne yapt???na bakal?m. ?lk olarak fs modln a??r?yoruz. Sonra callback1 ve callback2 ad?nda iki tane fonksiyon tan?ml?yoruz. Daha sonra (20. sat?rda) dosya okuma i?lemine ba?lan?r. Sonra ekrana Program devam ediyor… yazd?rd?k. Dosya okuma i?lemi bittikten sonra callback1 fonksiyonu al???r. callback1 ierisinde ncelikle hata kontrol yap?l?r. Hata yoksa writeFile fonksiyonu ile yazma i?lemine ba?lan?r. Sonras?nda konsol ekran?na Dosya okuma i?lemi bitti. yazd?r?l?r. Yazma i?lemi bittikten sonra ise callback2 fonksiyonu al???r. callback2 ierisinde de illk olarak hata kontrol yap?l?r. Daha sonra konsol ekran?na Dosya yazma i?lemi bitti. yazd?r?l?r. (writeFile fonksiyonunun herhangi bir dn? yok.) Daha sonra program?m?z sonlan?r. Yukar?daki kodu ?u ?ekildede yazabiliriz:

var fs=require("fs");

fs.readFile(process.argv[2],function (hata,dosyaIcerigi) {
    if (hata) {
        console.log("Bir hata olu?tu.")
        return;
    }
    fs.writeFile(process.argv[3], dosyaIcerigi, function (hata) {
        if (hata) {
            console.log("Bir hata olu?tu.")
            return;
        }
        console.log("Dosya yazma i?lemi bitti.")
    });
    console.log("Dosya okuma i?lemi bitti.");
});
console.log("Program devam ediyor...");

Bu ?ekilde kullan?m ok yayg?n. Ama i ie i ie ok fazla fonksiyon gelebilir ve kodun okunurlu?u ok d?ebilir. Bu tip durumlara Callback Hell yani Callback Cehennemi deniyor. Hangisi kolay?n?za geliyorsa kullanabilirsiniz.

?kinci rne?imizde de birden ok asenkron fonksiyonun ayn? program ierisinde kullan?m? grdk. Yine callback fonksiyonlar?n yada modl ierisindeki fonksiyonlar?n yap?s?n?n nas?l oldu?unu dkmantasyon zerinden ?rendik. Peki yazd???m?z kodlarda bize callback fonksiyonu yollanmas?n? nas?l sa?lar?z? Ve yollanan bu callback fonksiyonlar? nas?l kullan?l?r?

Bir sonraki blmde modler programlamay?, kendi modllerimi yazmay? ve kendi modllerimize callback fonksiyonlar? yollat?p onlar? kullanmay? grece?iz.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.


[jetpack_subscription_form]

NodeJS Ad?m 3 – NodeJS I/O

Ad?m Ad?m Nodejs yaz? dizimizin bir nceki yaz?s?ndanodejs uygulamar?n? nas?l al??t?rabilece?imizi bakt?k ve ilk uygulamalar?m?z yazm??t?k.

Bu blmde I/O (Input/Output) i?lemlerine yani dosya okuma/yazma i?lemlerine de?inece?iz. Nodejsin gl oldu?u yanlardan bir taneside I/O i?lemleridir. Ama I/O i?lemlerine gemeden nce bir kavramdan bahsetmem gerekiyor.

Bir nceki blmde nodejs zerinde global olarak kullanabilece?imiz modller oldu?undan bahsetmi?tik(process modl). Bu modllerden baz?lar? nodejs all???rken otomatik olarak yklenirken (process modl gibi) baz?lar?n? da bizim kod yazarken a??rmam?z gerekiyor. a??rma i?lemi ?u ?ekilde yap?l?yor var m1=require(modul1) . modul1 modln m1 de?i?kenine at?yoruz. m1 de?i?keni ile modul1 modlnn tm ieri?ine eri?ebiliriz. Bu modler yap?n?n ayr?nt?lar?na daha sonra de?inece?iz. ?imdilik bu kadar? yeterli.

Gelelim konumuza. I/O i?lemleri iin nodejs ierisinde fs(file system) modl kullan?lmaktad?r. Dosyalarla alakal? bir ok i?imizi bu modlle yapabiliriz. Bu blmde yapaca??m?z ilk rnekte bir dosya okuyup ieri?ini ekrana yazd?raca??z. Bunun iin fs modlnn readFileSync metodunu kullanaca??z. Kodlar?m?z ?u ?ekilde:

// fs modln a??r?yoruz
var fs=require("fs");

//dosyam?z?n yolunu verip ieri?ini de?i?kene at?yoruz
var dosyaIcerigi=fs.readFileSync("D:\\nodejsdersleri\\ornekdosya.txt");

//dosya ieri?imizi ekrana yazd?r?yoruz.
console.log(dosyaIcerigi.toString());

Bu kodlar al??t?rd???m?zda ?kt?m?z ?u ?ekilde olacak:

3-1-nodeio1

Bir sonraki rnekte dosya ismini konsol zerinden alaca??z. Ve ekrana sat?r say?s?n? yazd?raca??z. Bunun iin ikinci blmde bahsetmi? oldu?umuz process modlnden faydalanaca??z. Konsoldan dosya yolunu verirken yolun tamam?n? yazabilece?imiz gibi sadece al??an program dosyas?na gre yolunuda vere Sat?r say?s?n? almak iin ise gelen ifadeyi split metodu ile paralayaca??z. Paralarken de parametre olarak \n ifadesini kullanaca??z. \n ifadesi text dosyalar?nda yeni sat?r anlam?na gelir. Yaz? editrlerinde biz Enter tu?una bast???m?zda yeni bir sat?ra geer ama asl?nda yapt??? ?ey arka planda yaz?n?n ierisine \n ifadesini eklemektir. Biz program?m?z ierisinde dosyadan okumu? oldu?umuz yaz?y? \n ifadelerine gre paralarsak her bir sat?r? elde etmi? oluruz. Bunlar?n say?s? da bize sat?r say?s?n? verir. Kodlar?m?z?n anlatt?klar?m?za gre dzenlenmi? hali ?u ?ekilde:

var fs=require("fs");

//Dosya yolunu konsoldan al?yoruz
var dosyaIcerigi=fs.readFileSync(process.argv[2]);

//Elde etmi? oldu?umuz yaz?m?z? sat?rlara ay?r?yoruz
var satirlar=dosyaIcerigi.toString().split("\n");

//Sat?r say?s?n? ekrana yazd?r?yoruz.
console.log(satirlar.length);

Bu kodlar sonucu ?kt?m?z ?u ?ekilde olacakt?r:

3-2-nodeio2

Gelelim yazma i?lemlerine. Yazma i?lemleri iinde yine fs modln kullanaca??z. fs modl ierisindeki writeFileSync metodu dosya ierisine yaz? yazmam?z? sa?lamaktad?r. ?imdiki rne?imizde konsoldan hem dosya yolunu hemde ierisine ne yazaca??m?z? alaca??z.Ufak bir not: konsol zerindeki parametreler bo?luklarla birbirinden ayr?l?r. Bizim dosyaya yazd?raca??m?z yaz? bo?luk ieriyor ise bu yaz?y? konsola parametre olarak yollamak iin t?rnak iine almam?z gerekiyor. rnek kodlar?m?z ?u ?ekilde olacak:

var fs=require("fs");

// Dosya ismini ve ieri?ini konsoldan al?yoruz
var dosyaAdi=process.argv[2]
var yazi=process.argv[3]

//Dosyam?z?n ierisine yaz?m?z? yaz?yoruz
fs.writeFileSync(dosyaAdi,yazi)

Bu kodlar? al??t?rd???m?zda sonu ?u ?ekilde olacakt?r:

3-3-nodeio3

I/O blmnde anlatacaklar?m bu kadar. Bu blmde bir dosyay? okumay?, ieri?i ile ilgili basit i?lemler yapmay? ve dosyaya yaz? yazmay? ?rendik. Tabi burada basit text dosyas?n? okuduk ve onun zerinde i?lemler yapt?k. Text dosyas? d???nda resim, mzik gibi yzlerce dosya format? var ve do?al olarak yap?lar? birbirinden farkl?. Bunlar? i?lemek iinde her birinin format?n? bilmek gerekir. Yada onlara zel ktphaneler/modller kullanarak i?lemek gerekir. Bunlarla alakal? bilgi almak iin arama motorlar?n? kullanabilirsiniz.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.

Bir sonraki blmde asenkron programlamay? ?renece?iz.

NodeJS Ad?m 2 – NodeJS ile ilk uygulamam?z

Ad?m Ad?m Nodejs yaz? diziminin bir nceki yaz?s?nda front-end / back-end kavramlar?ndan, Javascript’in ne oldu?undan ve as?l konumuz Nodejs’in ne oldu?undan bahsettik.

Gelelim kod yazmaya. Nodejs ile kod yazmak iin tabiki ncelikle kurulumunu yapmam?z gerekiyor. Nodejs Windows, Linux, macOS i?letim sistemlerinde al??abilmektedir. al??ma mant??? her yerde ayn?d?r. nodejs.org adresinden sisteminize uygun kurulum dosyas?n? indirebilir sisteminize kurabilirsiniz. Nodejs ile u?ra??rken bol bol terminal kullanaca??z. (Temel konsol komutlar? iin buraya bakabilirsiniz.) Nodejs kurulumunu kontrol etmek iin terminal ekran?na node -vkomutunu girebilirsiniz. Komut sonucunda kurmu? oldu?unuz nodejs srmnn numaras? gelmi? olmal?.

2-1-nodev

Kurulum a?amas?ndan sonra bize gerekli olan bir terminal ekran? birde text editr. Bu yaz? dizisi boyunca yapaca??m?z rnekler iin benim kullanaca??m editr Visual Studio Code olacak. Ama bunun d???nda kullanabilece?iniz birok editr var: Notepad++, Atom, Brackets, Vim, hatta Notepad 🙂 Bunlar?n d???nda IDElerde kullanabilirsiniz. Kendiniz iin uygun olan veya daha nceden al??k?n oldu?unuz herhangi bir editor/IDE kullanabilirsiniz.

Merhaba Dnya!

Kendimiz iin uygun bir klasr setikten sonra yeni bir dosya olu?turuyoruz. Ben D:\nodejsdersleri klasrn kullanaca??m. Bu klasr ierisine program.js ad?nda bir dosya olu?turuyoruz. Ve ilk rne?imizi yazmaya ba?l?yoruz 🙂

Daha ncede belirtti?imiz gibi Nodejs javascriptin backendde al??mas?n? sa?layan motordur. Dolay?s?yla yazaca??m?z btn kodlar asl?nda javascript olacak.

?lk rne?imiz konsol ekran?na Merhaba Dnya! yazd?rmak olacak. Javascript kullanarak konsol ekran?na herhangi bir veri yollamak iin console.log() methodunu kulllan?yorduk. program.js dosyas? ierisine ?u kodu yaz?yoruz.

console.log("Merhaba Dnya!")

?imdi bu kodumuzu al??t?rmak iin konsol ekran?na geliyoruz. program.js dosyas?na ilerliyoruz. (Temel konsol komutlar? iin buraya bakabilirsiniz.) Daha sonra konsol zerinden node program.jskomutunu veriyoruz. Her?ey yolunda giderse konsol ekran?na Merhaba Dnya! yaz?s? ?km?? olmal?. Evet ilk nodejs kodumuzu yazm?? olduk.

2-2-nodehello

?kinci rnek olarak konsol ekran?ndan parametre olarak say?lar yollay?p toplamlar?n? ekrana yazd?raca??z.. nodejs sisteminde global olarak kullanabilece?imiz modller var. Bunlardan bir tanesi de process modl. process modl ile o anki nodejs prosesi hakk?nda bilgi alabilir ve kontrol edebiliriz. Konsolda program al??t?r?rken yollanan parametrelere de process s?n?f?n?n argv de?i?keni ile ula?abiliriz. Bu de?i?ken bize liste halinde girilen btn parametreleri gnderir. (Konsolda girilen parametreler birbirlerinden bo?luklarla ayr?l?r.) Bu listenin ilk eleman? nodejsin al??t??? yeri, ikinci parametre program.js yani kodlar?m?z?n al??t??? yeri sonraki parametreler de konsol ekran?ndan girilen parametreleri verir. Kodumuzu ?u ?ekilde dzenlersek process.argv de?i?keninin ieri?ini konsola yazd?rabiliriz.

console.log(process.argv)

Program?m?z? konsol zerinden node program.js Nodejs Derslerikomutu ile al??t?ral?m. Ekran ?kt?m?z ?u ?ekilde olacakt?r.

2-3-nodeargv

Gelelim toplama program?na. Konsoldan ald???m?z parametreleri toplat?p ekrana yazd?raca??z dedik. Bunun iin kodlar?m?z ?u ?ekilde olmal?:

var toplam=0;

// Dngnn 2den ba?lad???na dikkat edin. Neden? 🙂
for (var i = 2; i < process.argv.length; i++) {
   toplam+=Number(process.argv[i])
}
console.log(toplam)

Bu kodlar? yazd???m?zda da ?kt?m?z ?u ?ekilde olacakt?r.

2-4-nodetoplam

Evet ilk dersimizin sonuna geldik. Bu derste nodejsi nas?l al??t?raca??m?z?, konsol ekran?na nas?l yaz? yazd?raca??m?z? ve konsoldan parametre al?p nas?l kullanabilece?imizi grdk.

Bir sonraki blmdeI/O i?lemlerini inceleyece?iz.

NodeJS Ad?m 1 – NodeJS Nedir?

Ad?m Ad?m Nodejs yaz?lar?m?z?n ilkinde sizlere birka n bilgi ile beraber nodejs’in ne oldu?undan bahsedece?im.

Frontend & Backend Kavram?

Yazd???m?z uygulamalar yksek ihtimalle ok kullan?c?l? uygulamalard?r. oklu kullan?c?l? uygulamalar genelde Sunucu(Server)/?stemci(Client) mant??? ile yaz?l?r. Sunucu yani evrim ii al??an, tm verilerin tutuldu?u merkezi bir sistem. ?stemci yani bu merkezi sisteme ba?l? al??an merkezi sisteme veri iletimi yapan, kullan?c?yla etkile?imi sa?layan yan program.

serverside-clientside

Gnmz modern uygulamalar da bu istemci genelde taray?c?d?r(browser). Taray?c? zerinden kullan?lan uygulamalar genelde Web Uygulamas? olarak adland?r?l?r. Kullan?c? uygulamay? kullanmak istedi?inde taray?c?dan sunucuya bir istek gnderir, sunucu iste?e gre uygulama ierisinde kendi anlayaca?? blmleri i?leyerek kullan?c?ya uygun ?kt?y? retir ve taray?c?ya gnderir. Taray?c? ald??? ?kt?y? kendi ierisinde yorumlar ve kullan?c?ya uygun ?kt?y? retir. Sonra kullan?c? gerekti?i yerde tekrar sunucuya istek gnderir, tekrar cevap gelir Genel olarak taray?c? bazl? Sunucu/?stemci mimarisi basit anlat?mla bu ?ekilde al???r.

Burada nemli bir k?s?m sunucunun kendi anlad??? k?s?mlar? yani sunucu tabanl? diller(C#, Java, Php, Python, Ruby…) ile yaz?lm?? k?s?mlar? al??t?rmas?, taray?c?n?n da kendi anlad??? yani taray?c? dilleri(HTML,Css,Javascript, Dart… ) ile yaz?lm?? k?s?mlar? al??t?rmas?d?r. Sunucu taraf?nda al??an koda Backend, taray?c? zerinde al??an koda Frontend denir. Web uygulamar? yazarken Backend ve Frontend kodlar? ayn? proje ierisinde kullan?r?z. Hangi i? mant??? hangi k?s?mda al??acaksa ona gre ya Backendde yada Frontendde yaz?l?r.

unofficial_javascript_logo_2-svg

Javascript

Frontend dillerinden en nemlilerinden bir tanesi Javascripttir. Web taray?c?lar?n?n etkin bir ?ekilde kullan?lmas? iin geli?tirilmi?tir. Kullan?c?yla etkile?imin art?r?lmas?, i? yknn sunuculardan istemcilere ta??nmas?, daha grsel animasyonlu web siteleri/ web uygulamalar? geli?tirilmesi gibi kullan?m alanlar? vard?r. 1995 y?llar?nda ?kt?. Java diliyle isim benzerli?i d???nda hibir alakas? yoktur. Javasvript standartlar? Ecma International firmas? taraf?ndan ECMASCRIPT standartlar?yla belirlenir. Gnmzde kullan?lan ECMASCRIPT standard? 5.1 srmdr. Ve bu standart Javascript 1.8.1 ile desteklenmektedir. Ancak ?u aralar ECMASCRIPT 6 standard? zerinde al??malar devam etmektedir.

Javascript prototip bazl? nesne ynelimli programlama, fonksiyonel programlama, imparatif programlama paradigmalar?n? destekler. Genellikle taray?c?larda kullan?l?r. Google?n Chrome taray?c?s?n? ve bu taray?c? ierisindeki V8 Javascript motorunu geli?tirmesiyle Javascript performans?nda ve geli?imde byk ykseli?ler oldu. Bu Javascript motorunun gc sayesinde daha nce yap?lamayan birok uygulama yap?ld?. Ve ilk defa Javascript frontendden ?karak Backend taraf?na gei? yapt? ve Nodejs do?du.

node_js_logo

NodeJS

NodeJs 2009 y?l?nda Joyent firmas?nda al??an Ryan Dahl taraf?ndan geli?tirilen Javascript al??ma Ortam?d?r.(Javascript Runtime Enviroment). Joyent firmas?n?n deste?i ve V8 motorunun gc ile Dahl Javascripti Backend k?sm?na ta??d?.

Nodejs backend taraf?nda al??an, javascript tabanl? scriptleri yorumlanabilen ve al??t?rabilen, h?zl?, leklenebilir network uygulamalar? geli?tirmeyi sa?layan bir al??ma zaman? ortam?d?r(runtime enviroment).

Javascriptin backende(server side) ta??nmas? ile developerlar tek dil bilerek hem frontend hem backend kod yazabilir hale geldiler. Frontend de kullan?lan javascript ktphanelerinden baz?lar? backend taraf?nda kullan?labilir hale geldi.

Javascriptin do?al Non Block mimarisi sayesinde backend taraf?nda leklenebilir uygulamalar daha kolay bir ?ekilde yaz?labilir hale geldi. Nodejsin leklenebilir uygulamalardaki ba?ar?s? sayesinde kullan?c? say?s? milyonlarla ifade edilen byk siteler nodejs kullanmaya ba?lad?. stelik bunu single thread olarak yapabiliyor.

leklenebilirlik, bir uygulaman?n ayn? anda birden ok kullan?c?ya tak?lmadan cevap verebilir halde olmas?d?r.

Peki bunu nas?l ba?ar?yor? Nodejs olay bazl?(event-driven) Non-Blocking yap?s?n? Event loop denilen bir mimariyle sa?l?yor. (?lerde detay?na girece?iz.) Bu mimariyle tek bir thread(single thread) ile asenkron al??abilmektedir.

Bunlar?n d???nda Nodejsin en byk avantajlar?ndan bir taneside modler yap?s? ve bu yap?y? destekleyen paket ynetim sistemi: npm(nodejs package manager). Nodejs npm ve npm yi destekleyen topluluk sayesinde hemen hemen her i?imizi paketler sayesinde halledebiliyoruz. ?uan npm zerindeki paket say?s? yakla??k 250000 civar?nda. E okadar paket ierisinde mutlaka i?imize yarayan bir paket vard?r :). Tabi bu kadar paket Nodejsin arkas?nda ok byk bir toplulu?un oldu?unuda gsteriyor. Bu kadar byk bir toplulu?un ierisinde sorunlar? zmekte kolay.

Bir sonraki yaz?m?zda rnek kodlara ba?layaca??z ve ilk uygulamalar?m?z yazaca??z.