JavaScript statik metot kullanımı sırasında yaşadığım sorun ve senkron dosya okuma

Merhaba, node.js ile backend yazıyorum ancak takıldığım bir yer var sınıf içerisinde sınıfa ait metot var bu metot veritabanına bağlantı sağlıyor daha sonra static metot var buda veritabanından sorgulama yapacağım zaman çağıracağım metot ancak sınıfa ait metod return içermesine rağmen static metotta kullanamıyorum. Bir yerde eksik yapıyorum bunu nasıl çözebilirim…

Bir başka sorunum ise get request metodu sırasında belli bir dosya okunacak dosya var ise farklı bir sayfa yok ise başka bir sayfa gösterilecek ancak fs modülü ile ilgili işlemleri başka bir js dosyasının içerisinde yapıyorum bu sebeple her ne kadar readFileSync desemde senkron çalışmıyor ve dosya bulunamadı diye browser’da hata alıyorum ilgili kodlar aşağıdadır.

var mysql = require("mysql");

class Database {
    constructor(host, user, password, database, port) {
        this.host = host;
        this.user = user;
        this.password = password,
        this.database = database,
        this.port = port || 3306
    };

    dbConnetor() {
        let connector = mysql.createConnection({
            host: this.host,
            user: this.user,
            password: this.password,
            database: this.database,
            port : this.port
        });
        
        return connector;
    }

    static getDatabase(queryString) {
        this.dbConnetor().query(queryString, (err, data) => {
            if (err) {
                return err;
            }
            else {
                return data;
            }
        });
    };
};

module.exports = Database;

router.js dosyasında olan kodlar

var express = require("express");
var router = express.Router();
var path = require("path");
var Database = require("../../Model/database")
var createDbJson = require("../../Model/createDbJson");

router.get("/", (req, res) => {
    let file = createDbJson.jsonFile();

    if(file == "undefined"){
        console.log("if", file)
        res.render("../Views/ui/createdatabase.pug", {title: "Veritabanı Oluştur"});
    }
    else{
        console.log("else", file)
        res.render("../Views/ui/login.pug", {title: "Giriş Yap"});
    }

});

router.post("/", (req, res) => {

})

module.exports = router;

router.js e import ettiğim fs işleminin yapıldığı dosyada bulunan kodlar

var fs = require("fs");

module.exports.jsonFile = fs.readFileSync(__dirname + "./database.json", (err, file) => {
    if(err){
        console.log("CDJ-ERR", err);
        return err;
    }
    else{
        console.log("CDJ-FILE", file);
        return file;
    }
});

module.exports.createFile = (host, user, password, database, port) => {
    fs.appendFile("./Model/database.json", {host: host, user: user, password: password, database: database, port: port}, () => {});
}

Daha fazla noktalama isareti kullanman lazim yazdiklarin neredeyse okunmuyor okuyabildigim kadariyla ayni sekilde cevapliyorum…

getDatabase neden statik statik olmamasi lazim sanki gerci nasil cagirdigina bakar ama cagirirken this'i bind ettigini zannetmiyorum gerci kullanamamaktan kastinin ne oldugunu bilsek daha iyi cevaplayabilirdik hata mesaji mi cikiyor ne oluyor?

jsonFile bir fonksiyon degil readFileSync fonksiyonunun dondurdugu sonuc ve o sonucu cagiramazsin sanirim readFileSync cagiran bir fonksiyon olmasi lazim createFile gibi.

bkz: Soru Sorarken Sıkça Düşülen Hatalar

Merhaba, Yazım kuralları için özür dilerim bu konuda dikkatsizim. İşin özü şu aslında MVC mantığına göre yazmaya çalışıyorum yani veritabanı işlemleri ayrı bir kod dosyasında olacak dosya işlemleri ayrı kod dosyasında vs. vs. ancak mesela veritabanı dosyasında bir fonksiyon var getDatabase. Bu fonksiyon paremetre olarak sql söz dizimini alacak, router dosyasından bu fonksiyonu sql sözdizimi parametresi verdiğimde sorgu yapacak ve sonucu router dosyasına gönderecek ancak burada router dosyası getDatabase den sonucu beklemeden undefined üretiyor yani asenkron çalışıyor bunun önüne geçmeye çalışıyorum… Hem dosya okuma işlemi hemde veritabanı sorgu işleminde aynı sorunu yaşıyorum ikisinde de sorun asenkron çalışması birini çözebilirsem diğerini de aynı mantıkla çözebilirim diye düşünüyorum.

static metodun ne olduğuna şuradan bakabilirsin: static - JavaScript | MDN

Oradaki kullanımın yanlış linkete şöyle diyor: :or any other data you don’t need to be replicated across instances. static metoddan this e ulaşamazsın.

Diğer içeride kullandığın this.dbConnetor().query metodu büyük ihtimalle asenkron, onu bir kontrol et. Orada da promise veya await kullanabilrisin.

Yazim kurallarina herhangi bir programlama dilindeki kurallara verilen dikkatin ceyregini versek yeter diye dusunuyorum bazen :slight_smile:

Neyse, getDatabase'in statik olup olmamasi gerektigini bilmiyorum, cunku nasil kullanildigi paylasilmamis, fakat sorun muhtemelen statik oldugu halde icinde this kullanilmasi. Normalde this, metodun cagrildigi instance oluyor. (db.metod();'daki db)

Baska bir sorun da getDatabase'in deger dondurmemesi. Icerideki return’ler query'e ikinci parametre olarak giden isimsiz fonksiyona ait.

Bu arada query muhtemelen ikinci parametre olarak aldigi fonksiyonun dondurdugu degeri kullanmiyor. Peki o zaman data'ya disaridan nasil erisecegiz? data'yi kullanmak isteyen fonksiyonu getDatabase'e paslayacagiz ve icerideki fonksiyondan return etmek yerine oradan cagiracagiz. Bu, alistigimiz/ogretilen imperatif programlamaya aykiri bir stil fakat bugun JavaScript yazmak istedigimizde mecbur kaldigimiz bir sacmalik. Asenkron programlama, callback’ler ve callback cehennemi, async/await, future’lar/promise’lar gibi seyleri arastirabilirsiniz.

1 Beğeni

Bence biraz yanlış anlaşılma var.

mesela query nin içi şöyle olabilir:

async function query(string, callback) {
// bişey bişey 
//...
  try{
    data = await getData(quertString)
    callback(null, data)
  }catch (e){
    callback(e,null)
  }
// .... 
// bişey bişey
} 

şöyle de yapabilirsin

    
  
    getDatabase(queryString) {
       var myData = null
       await  this.dbConnetor().query(queryString, (err, data) => {
            if (err) {
                return err;
            }
            else {
                myData = data
                return data;
            }
        });
    };

callback'in return degerine bakilmiyorsa return err / return data satirlarina ihtiyac yok.

myData'nin degeri degistirildikten sonra kod calistirilmadigi icin programin hic bir yerinde null olmamasinin garantisi yok.

asynchronous fonksiyonlara bulasiliyorsa butun kodu o stilde yazmak lazim.