Node.js Olay Yöneticisi

Yazıda Node.js olay yöneticisi ve olay yöneticisi kullanımı çeşitli örneklerle anlatılmıştır.

Olaya dayalı programlama Node.js’in en önemli özelliklerinden biridir.

Bilgisayardaki her eylem bir olaydır.

Eylemlere örnek olarak; bilgisayarın açılması, dosyanın açılması, dosyanın kapatılması, web sayfanın açılması, klavyeden bir tuşa basılması gibi örnekler verilebilir.

Node.js events modülü çeşitli eylemler için olay tanımlamaya imkan verir.

Modül içerisinde özel olay eklemek kaldırmak için kullanılan EventEmitter nesnesine sahiptir.

Projeye events modülünü dahil etmek için aşağıdaki sözdizimi kullanılır.

'use strict';

const events = require('events');
const eventEmitter = new events.EventEmitter();

EventEmitter nesnesi içerisinde yer alan on metodu ile bir olay oluşturulur.

'use strict';

const events = require('events');
const eventEmitter = new events.EventEmitter();

function merhaba() {
  console.log('Merhaba Dünya');
}

eventEmitter.on('yaz', merhaba);

Daha sonra kullanılmak üzere yaz isminde bir olay oluşturduk ve bu olay tetiklenince merhaba isimli fonksiyonun çalıştırılmasını sağladık.

Bir olayı tetiklemek için EventEmitter nesnesi içerisinde yer alan emit metodu kullanılır.

'use strict';

const events = require('events');
const eventEmitter = new events.EventEmitter();

function merhaba() {
  console.log('Merhaba Dünya');
}

eventEmitter.on('yaz', merhaba);

eventEmitter.emit('yaz');

Kodlar çalıştırıldığından aşağıdaki sonuca benzer bir sonuç verecektir.

node index.js
Merhaba Dünya

Bazı olaylar birden fazla gerçekleşebilir.

'use strict';

const events = require('events');
const eventEmitter = new events.EventEmitter();

function merhaba() {
  console.log('Merhaba Dünya');
}

eventEmitter.on('yaz', merhaba);

eventEmitter.emit('yaz');
eventEmitter.emit('yaz');
eventEmitter.emit('yaz');

Kodlar çalıştırıldığından aşağıdaki sonuca benzer bir sonuç verecektir.

node index.js
Merhaba Dünya
Merhaba Dünya
Merhaba Dünya

Olay için tanımlanmış fonksiyona parametre geçirilmesi gerekebilir.

Parametre geçirilmesi olay tetiklemek için kullanılan emit metoduna ek parametrelerin yazılmasıyla sağlanır.

'use strict';

const events = require('events');
const eventEmitter = new events.EventEmitter();

function mesaj(msj) {
  console.log(msj);
}

eventEmitter.on('mesaj', mesaj);

eventEmitter.emit('mesaj', 'Dışarıdan bir mesaj');

Kodlar çalıştırıldığından aşağıdaki sonuca benzer bir sonuç verecektir.

node index.js
Dışarıdan bir mesaj

Bazen bir olayın sadece bir kere gerçekleşmesi istenebilir.

Bir olayın sadece bir kere gerçekleştirilmesi için EventEmitter nesnesine ait once metodu kullanılır.

'use strict';

const events = require('events');
const eventEmitter = new events.EventEmitter();

function merhaba() {
  console.log('Merhaba Dünya');
}

eventEmitter.once('yaz', merhaba);

eventEmitter.emit('yaz');
eventEmitter.emit('yaz');
eventEmitter.emit('yaz');

Kodlar çalıştırıldığından aşağıdaki sonuca benzer bir sonuç verecektir.

node index.js
Merhaba Dünya

Olay yöneticisi kullanım örneği

Olay yöneticisi Node.js Geri Bildirim yapısına benzer.

'use strict';

const events = require('events');

function BirIslem(sayi) {

  const eventEmitter = new events.EventEmitter();

  setTimeout(function () {

    for (let i = 1; i <= sayi; i++) {

      eventEmitter.emit('basla', i);

      console.log('İşlem sırası : ' + i)

      eventEmitter.emit('bitir', i);

    }

  }, 1000);

  return eventEmitter;

}

let islem = BirIslem(3);

islem.on('basla', function (sira) {

  console.log('Sırası ' + sira + ' olan işlem başladı.');

});

islem.on('bitir', function (sira) {

  console.log('Sırası ' + sira + ' olan işlem bitti.');

});

Kodlar çalıştırıldığından aşağıdaki sonuca benzer bir sonuç verecektir.

node index.js
Sırası 1 olan işlem başladı.
İşlem sırası : 1
Sırası 1 olan işlem bitti.
Sırası 2 olan işlem başladı.
İşlem sırası : 2
Sırası 2 olan işlem bitti.
Sırası 3 olan işlem başladı.
İşlem sırası : 3
Sırası 3 olan işlem bitti.

Node.js içerisinde yer alan çoğu modül olay yöneticisi kullanımına imkan verir.

Bu modüllerden birisi de HTTP sunucu oluşturmak için kullanılan Node.js http Modülüdür.

Modül içerisinde tanımlanmış çeşitli olaylar vardır.

Tanımlı olan olaylar sayesinde olay yöneticisi çeşitli işlemler yapılmasına imkan verir.

'use strict';

const http = require('http');

const sunucu = http.createServer(function (request, response) {

  response.write('Merhaba Node.js');

  response.end();

});

sunucu.listen(1453);

console.log('Sunucu çalışıyor...');

sunucu.on('connection', function (socket) {

  console.log('Yeni bir giriş algılandı.');

});

sunucu.on('request', function (socket) {

  console.log('Yeni bir istek algılandı.');

});

Kodlar çalıştırıldığından aşağıdaki sonuca benzer bir sonuç verecektir.

node index.js
Sunucu çalışıyor...

Tarayıcıdan adres açıldığında Node.js aşağıdaki sonuca benzer bir sonuç verecektir.

node index.js
Yeni bir giriş algılandı.
Yeni bir istek algılandı.

Sayfa her yenilendiğinde sonuç değişecektir.

node index.js
Yeni bir giriş algılandı.
Yeni bir istek algılandı.
Yeni bir istek algılandı.

Ayrıca farklı bir kullanıcı veya farklı bir tarayıcıdan giriş yapıldığında da sonuç değişecektir.

node index.js
Sunucu çalışıyor...
Yeni bir giriş algılandı.
Yeni bir istek algılandı.
Yeni bir istek algılandı.
Yeni bir giriş algılandı.
Yeni bir istek algılandı.

HTTP modülü örneğinde her yeni bağlantı ve her yeni bir istek sonrasına tanımlı olaylar gerçekleşmiş oldu.

Node.js içerisinde yer alan olay yöneticisi sayesinde bir veritabanı uygulamasında yeni bir kayıt eklendiğinde, kayıt düzenlendiğinde veya kayıt silindiğinde çalıştırılmak üzere bir olay tanımlayabilir ve daha sonra kullanabilir.

Böylece uygulama içerisinde gerçekleşen olaylar daha kolay takip edilip daha kolay müdahale edilebilir.

Node.js Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!