Oyunun Veritabanı Bağlantıları - NOY#4

noyjavascriptoyunyoutube

1 yıl önce 0 yorum

Oturum sistemini de ayarladığımıza göre artık veritabanı yönetimine geçebiliriz. Şimdi 3NF kurallarına uyan bir veritabanı oluşturalım.

id name email date
kullanıcının id'si kullanıcının kendini açıkladığı isim kullanıcının email adresi kullanının kayıt tarihi

Şimdilik bu şekilde bir veritabanı oluşturduk. Bu makalede veritabanı bağlantılarını göreceğiz.

Sistemde MySQL kullanmayı istemediğim için PostgreSQL kullanmaya karar verdim. Bundan sonra devam etmek için bilgisayarınıza PostgreSQL kurmanız gerekiyor. Buradan takip ederek kurulumunu yapabilirsiniz. Kurulumu yaptıysanız satranç için gerekli olan role ve veritabanı işlerini halledelim.

PostgreSQL bilgisayarınıza kurulduysa komut satırınan veritabanına giriş yapalım:

$ psql -U postgres

Giriş yaptığınıza sizi postgres=# karşılıyor olmalı. Şimdi ise satranç için role ve veritabanını oluşturalım.

postgres=# CREATE ROLE satranc_user WITH LOGIN;
postgres=# CREATE DATABASE satranc;

Role oluşturduk şimdi onun isminde giriş yapmalıyız. CTRL + D ile çıkış yapalım ve tekrar girelim:

$ psql -U satranc_user -d satranc

Ardından veritabanımızın ekli olduğunu görmek için \l komutunu çalıştıralım.

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 satranc   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
.
.
.
.
(4 rows)

Tablomuzu oluşturmanın tam sırası.

satranc=> CREATE TABLE users (id SERIAL PRIMARY KEY, name CHAR(255), email CHAR(1024), date DATE);

Tablomuz da oluştuğuna göre artık nodejs ile bu sisteme bağlanabiliriz. 

PostgreSQL'nin node.js üzerinde kullanılması

Node.js'te pg modülünü kullanacağız. Bu modül node.js'in PostgreSQL ile bağlantı kurmasını sağlıyor. pg kurulumu:

$ npm i pg --save-dev

Uygulamamızda bir ayar dosyası tutmalıyız veritabanı veya diğer ayarlar için. O yüzden server/config.js dosyasını oluşturalım ve db değerine PostgreSQL ayarlarını ekleyelim.

module.exports = {
    db: {
        name: 'satranc',
        user: 'satranc_user',
        host: 'localhost',
        password: '',
        port: 5432,
    }
}

Veritabanı ile alakalı işlemleri yönetmek için server/database dizinini oluşturup server/database/index.js dosyasını düzenliyoruz.

// pg modülünün Client modeline ihtiyacımız var
const { Client } = require('pg');
// ayarlarımızı getiriyoruz
const config = require('../config');

class Database {
    constructor() {
        this.client = null;
    }

    connect(){
        this.client = new Client({
            user: config.db.user,
            host: config.db.host,
            database: config.db.name,
            password: config.db.password,
            port: config.db.port,
        });
        return this.client.connect();
    }

    select(params){
        var self = this;
        return new Promise((resolve, reject) => {
            // denemek için sadece bu sorguyu çalıştıralım
            this.client.query( 'SELECT * FROM users', (err, res) => {
                if (err !== null) {
                    reject(err);
                } else {
                    resolve(res.rows);
                }
            })
        });
    }
}

// import ettiğimiz yerde direkt database.<method-adı> şeklinde kullanmak için bu şekilde export ediyoruz
module.exports = new Database();

Veritabanı sınıfımızı oluşturduğumuza göre bağlantımızı yapmak için server/uses.js dosyasında kullanalım.

…
const database = require('./database');

module.exports = (app) => {

    const client = redis.createClient();
    // uygulamamızı veritabanına bağlıyoruz
    database.connect();

    app.use(session({
…

Evet uygulamamız başladığımızda veritabanımıza bağlanılabilir hale gelecek. Bu durumda bizim yapacağımız şeyler CRUD yapmak olacak fakat onu bu derste anlatmayacağım. Çünkü CRUD için standart bir yapı oluşturmamız gerekecek. Onu diğerki derslerde göreceğiz. 

Biz kullanıcıları görmek için server/index.js dosyasında şu değişiklikleri yapabiliriz:

...
const database = require('./database');
...
app.get('/', (req, res) => {
    database.select()
    .then(data => {
        res.send(data);
    }, err => {
        res.send(err);
    })
})
...

Böylelikle kullanıcı listesini getirebileceğiz. şimdi sunucumuzu artık terminale node server/server.js yazarak başlatmayalım onun yerine package.json dosyasındaki scripts değerine ekleyelim.

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

npm run start:server komutunu ile sunucumuzu çalıştıralım.

localhost:3000 adresine giriş yaptığımızda böyle bir boş dizi ile karşılaşacağız [] çünkü henüz bi kullanıcı eklemedik.

Şuan CRUD'u yapmadığımız için geçici olarak kullanıcı eklemek için psql kabuk komutundan ekleyelim.

$ psql -U satranc_user -d satranc

Ardından insert komutumuzu çalıştıralım ve Ctrl + D kombinasyonu ile çıkalım.

satranc => INSERT INTO users (name, email, date) VALUES ('Avare Kodcu', 'test@avarekodcu.com', NOW());

Sunucumuzu tekrar başlatalım ve aynı şekilde localhost:3000 adresine bir istekte bulunalım. İstekten dönen cevap:

[{"id":1,"name":"Avare Kodcu                                                                                                                                                                                                                                                    ","email":"abdurrahmaneker58@gmail.com                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ","date":"2018-01-27T21:00:00.000Z"}]

Bu cevabın uzun dönmesinin sebebi veritabanında char() olarak tanımlama yaptığımız içindi. Biz tabi sorguyu çekerken şu şekilde çekmiş olsaydık:

select RTRIM(name) as name, RTRIM(email) as email, date from users;

Bu şekilde bir response dönerdi:

[{"name":"Avare Kodcu","email":"abdurrahmaneker58@gmail.com","date":"2018-01-27T21:00:00.000Z"}]

Bu haftaki konu bu kadardı. Okuduğunuz ve zaman ayırdığınız için teşekkür ederim. Diğer bölümde görüşmek üzere sağlıcakla kalın :)

Düşündüklerin nedir ?

Abdurrahman Eker

(1010 Eylül 11111001100)

  • Full Stack Developer at Detaysoft Turkey/Sivas
  • İnternette Avare Kodcu
  • github
  • linkedin
  • youtube
  • Yeni içeriklerden haberdar olmak ister misin ?