اذهب إلى المحتوى
  • 0

كيف يمكنني تخزين استعلامات MongoDB وتجنب استعلام قاعدة البيانات في كل مرة يتم فيها عرض الصفحة؟

Abdelrahman Mostafa10

السؤال

في تطبيق ويب JS الحالي الذي أعمل عليه، أقوم حاليًا بعرض rendering  صفحاتي بمعلومات محددة من مجموعة بيانات MongoDB Atlas.

للأسف، لا أعرف ما يكفي عن JS لإصلاح مشكلة رئيسية، حيث أن الكود الحالي يستعلم قاعدة البيانات في كل مرة يتم فيها تقديم صفحة حسب ما أفهم، ويبدوا أن تلك مشكلة كبيرة بالنسبة لسرعة تطبيقي، لذا، أرغب في معرفة كيف يمكن استدعاء تلك الاستعلامات وتخزينها في بداية تشغيل تطبيق الويب بحيث لا يحدث ذلك مرة أخرى.

const express = require('express');
const Link = require('./models/link');
const Site = require('./models/site');
const app = express();
const port = 3000;

const dbURI = 'censored';
mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true })
  .then((result) => app.listen(port))
  .catch((err) => console.log(err))
const db = mongoose.connection;

app.set('view engine', 'ejs');
app.use(express.static('public'));

app.get('/', async (req, res) => {
  try {
    const [links, sites] = await Promise.all([
    Link.find({}).sort({ order_no: 'asc' }),
    Site.find({}).sort({ order_no: 'asc' })]);
    res.render('index', { title: "Home", links, sites })
  } catch (e) {
    console.log(e);
    res.sendStatus(500);
  }
});

app.get('/page01', async (req, res) => {
  try {
    const [links, sites] = await Promise.all([
    Link.find({}).sort({ order_no: 'asc' }),
    Site.find({}).sort({ order_no: 'asc' })]);
    res.render('page01', { title: "Home", links, sites })
  } catch (e) {
    console.log(e);
    res.sendStatus(500);
  }
});

app.get('/page02', async (req, res) => {
  try {
    const [links, sites] = await Promise.all([
    Link.find({}).sort({ order_no: 'asc' }),
    Site.find({}).sort({ order_no: 'asc' })]);
    res.render('page02', { title: "Home", links, sites })
  } catch (e) {
    console.log(e);
    res.sendStatus(500);
  }
});

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

هذا في الحقيقة طبيعي اذا كانت بياناتك قابلة للتحديث باستمرار.

اذا لم تكن كذلك، فيمكنك ان تقوم بحفظ البيانات التي تم جلبها من قاعدة البيانات mongodb لمدة معينة (لنقل عشر دقائق)، وبعد ذلك تقوم node js باعادة جلب هذه البيانات مجددا واعادة حفظها لعشر دقائق اخرى، عوضا عن جلب البيانات عند كل تحديث للصفحة، ممايسرع تطبيقك ويحسن الاداء.

يمكنك فعل ذلك بواسطة المكتبة node-cache بعد تحميلها بواسطة:

npm i node-cache

وبعد استخدامها على النحو التالي:

const NodeCache = require('node-cache');
const myCache = new NodeCache();

// قم بجلب البيانات من مونغو
const fetchData = async () => {
  const data = await fetchDataFromSource();
  // عملية حفظ البيانات في ال "كاش" لمدة عشر دقائق
  myCache.set('cachedData', data, 60 * 10);
  return data;
};

// تحقق اذا كانت البيانات موجودة في الكاش
const getCachedData = () => {
  const cachedData = myCache.get('cachedData');
  if (cachedData) {
    // اذا كانت موجودة قم بجلبها بدون اعادة طلب البيانات من قاعدة البيانات
    console.log('Data retrieved from cache.');
    return Promise.resolve(cachedData);
    // اذا لم تكن موجودة قم بجلبها من جديد من قاعدة البيانات
  } else {
    console.log('Data not in cache. Fetching...');
    return fetchData();
  }
};

// مثال
getCachedData().then((data) => {
  console.log('Final data:', data);
});

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...