• 28-07-2023, 15:29:41
    #1
    merhaba benim express tabanlı bir websitem var aşşağıdaki kodda görüldüğü gibi sayfaları require edip sayfalara bazı veriler gönderiyorum örnek profiles, projects vs. Bunları o sayfa içinde yapınca websitesi çok yavaşlıyor o yüzden ana dizinde verileri alıp dosyalara gönderiyorum. Ancak bu fonksiyonu döngüye alsamda profiles veya projects ( bu ikisi örnek gönderdiğim tüm verilerde durum aynı. ) güncellenmiyor. Ben verileri ana dizinde güncelliyorum yeni veriler ile web sayfalarının backend kodlarını nasıl yeniden require edebilirim siteyi kapatmadan arkaplanda.

    const fs = require("fs");
    function clearRequireCache(modulePath) {
        delete require.cache[require.resolve(modulePath)];
      }
      
    // Fonksiyonu oluşturuyoruz
    function readdirRecursive(directory, callback) {
        fs.readdirSync(directory).forEach((file) => {
            const fullPath = path.resolve(directory, file);
            if (fs.statSync(fullPath).isDirectory()) {
                // Eğer bir klasörse, rekürsif olarak çağır
                readdirRecursive(fullPath, callback);
            } else {
                // Eğer dosyaysa, işlem yap
                callback(fullPath);
            }
        });
    }
    // Kullanım örneği
    function requirePages() {
        readdirRecursive("./api-pages", (filePath) => {
          if (filePath.endsWith(".js")) {
            // Şu anki modül için cache'i temizle
            clearRequireCache(filePath);
      
            // Sayfa modülünü tekrar require et
            const pageModule = require(filePath);
      
            // Sayfa için güncel parametreleri al
            pageModule(app, checkAuth, db, moment, renderTemplate, config, top20code, lastshared, projects, profiles, codeviews, client);
            console.log(`[API] ${filePath} yüklendi!`);
          }
        });
      }
    // Fonksiyonu başlangıçta çalıştır
    requirePages();
  • 28-07-2023, 15:35:48
    #2
    Express tabanlı bir web sitesinde verileri arkaplanda güncellemek için dosyaları tekrar require etmeniz yerine, güncel verileri tutabileceğiniz bir veritabanı veya bellek önbelleği kullanmanız daha uygun olacaktır. Bu şekilde sayfaları her istendiğinde yeniden require etmek yerine, veritabanından veya bellek önbelleğinden güncel verileri alarak web sitesinin performansını artırabilirsiniz.
    Veritabanı olarak popüler seçenekler arasında MongoDB, MySQL, PostgreSQL gibi SQL veya NoSQL tabanlı veritabanları bulunmaktadır. Ayrıca, Redis gibi hafızada veri saklamaya yönelik bir bellek önbelleği de kullanılabilir.
    Ancak, eğer dosya tabanlı bir çözüm kullanmaya karar verdiyseniz ve verileri ayrı dosyalarda tutmak yerine, bir ana veri dosyasında tutmayı tercih edebilirsiniz. Böylece tüm sayfalardan verilere tek bir dosya üzerinden erişebilirsiniz. Aşağıdaki gibi bir yaklaşım izleyebilirsiniz:
    1. Ana veri dosyası oluşturun ve içine verileri JSON formatında kaydedin. Örneğin, "data.json" adında bir dosya oluşturun.
    {
      "profiles": [...],
      "projects": [...],
      ...
    }
    2. Verileri güncellediğinizde, "data.json" dosyasını güncelleyin.
    3. Sayfalarda verilere ihtiyaç duyduğunuzda, "data.json" dosyasını require ederek içindeki güncel verilere erişebilirsiniz.
    Örnek olarak, "profiles" ve "projects" verilerine ana veri dosyasından nasıl erişebileceğinizi göstereyim:


    const fs = require("fs");
    const path = require("path");
    
    let data = {}; // Boş bir nesne oluşturuyoruz, verileri burada saklayacağız
    
    // Ana veri dosyasını require ederek içindeki verileri güncelliyoruz
    function updateData() {
      const dataFilePath = path.resolve(__dirname, "data.json");
      const rawData = fs.readFileSync(dataFilePath);
      data = JSON.parse(rawData);
    }
    
    // Sayfaları tekrar require etmek yerine verileri buradan alabilirsiniz
    function getPageData() {
      return {
        profiles: data.profiles,
        projects: data.projects,
        // Diğer verileri de buraya ekleyebilirsiniz
      };
    }
    
    // Verileri başlangıçta yüklemek için
    updateData();
    
    // Verileri belirli bir aralıkla güncellemek isterseniz, örneğin her 5 dakikada bir, bir zamanlayıcı kullanabilirsiniz.
    setInterval(updateData, 5 * 60 * 1000); // 5 dakika (5 * 60 * 1000 milisaniye)
    
    // Kullanım örneği
    function requirePages() {
      readdirRecursive("./api-pages", (filePath) => {
        if (filePath.endsWith(".js")) {
          // Sayfa modülünü tekrar require etme yerine getPageData() fonksiyonunu kullanarak güncel verileri alıyoruz
          const pageModule = require(filePath);
          const pageData = getPageData();
    
          // Sayfa için güncel parametreleri al
          pageModule(app, checkAuth, db, moment, renderTemplate, config, top20code, lastshared, pageData);
          console.log(`[API] ${filePath} yüklendi!`);
        }
      });
    }
    Bu şekilde, ana veri dosyasını güncellediğinizde tüm sayfalar otomatik olarak güncel verilere erişecektir. Ancak, yine de uzun aralıklarla güncellenen verilere anlık erişim sağlamak için veritabanı veya bellek önbelleği kullanmanız daha uygun olacaktır.
  • 28-07-2023, 15:39:52
    #3
    sildim