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(); Nodejs express sorum var.
2
●90
- 28-07-2023, 15:29:41merhaba 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.
- 28-07-2023, 15:35:48Express 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.