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

Sam Ahw

الأعضاء
  • المساهمات

    1388
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    16

كل منشورات العضو Sam Ahw

  1. يجب عليك كتابة الشيفرة البرمجية التي تستخدم فيها fetch لنستطيع مساعدتك بشكل أفضل، فلا يمكن تحديد الخطأ الذي يحدث دون الاطلاع على الشيفرة البرمجية التي تقوم بكتابتها. أما بالنسبة للفرق بين fetch , fetchAll فهو بسيط جداً: يقوم التابع fetch بإعادة سطر واحد فقط (أول سطر) من قاعدة البيانات. مثال: <?php $sth = $dbh->prepare("SELECT name, colour FROM fruit"); $sth->execute(); print("استعادة أول نتيجة من جدول قاعدة البيانات"); $result = $sth->fetch(PDO::FETCH_ASSOC); print_r($result); وسيكون الناتج بشكل مصفوفة الحقل المفتاح فيها هو اسم العمود في قاعدة البيانات وقيمته هي قيمة العنصر نفسه: Array ( [name] => apple [colour] => red ) أما التابع fetchAll: يقوم بإعادة مصفوفة فيها جميع الأسطر (النتائج) الموجودة في قاعدة البيانات. مثال: <?php $sth = $dbh->prepare("SELECT name, colour FROM fruit"); $sth->execute(); print("استعادة اسم ولون جميع الفواكه الموجودة في جدول قاعدة البيانات"); $result = $sth->fetchAll(); print_r($result); ?> وسيكون الناتج ضمن مصفوفة بالشكل التالي: Array ( [0] => Array ( [name] => apple [0] => apple [colour] => red [1] => red ) [1] => Array ( [name] => pear [0] => pear [colour] => green [1] => green ) [2] => Array ( [name] => watermelon [0] => watermelon [colour] => pink [1] => pink ) ) أما بالنسبة للشرح، فيمكنك قراءة التوثيق لأي تابع أو خاصية في PHP مباشرةً من الموقع الرسمي وستحصل على جميع التفاصيل اللازمة لعمله وأمثلة عن استخداماته.
  2. يمكنك التواصل مع فريق الدعم في مركز مساعدة حسوب (من هنا) لإخبارهم بذلك وسيطعلونك على التفاصيل.
  3. يجب أن توضّح سؤالك وعلى الأقل ذكر لغات البرمجة المستخدمة في مشروعك غير الجافا سكريبت وماهو نوع قواعد البيانات الذي تستخدمه. وإلا ستحصل على إجابات غير مكتملة أيضاً. يمكنك استخدام AJAX مع الحدث onkeyup في الجافاسكريبت لإرسال الكلمات التي يتم إدخالها بحقل البحث إلى الخادم وإجراء البحث عنها ثم إعادة النتيجة إلى المستخدم: <html> <head> <script> function showResult(str) { if (str.length==0) { document.getElementById("livesearch").innerHTML=""; document.getElementById("livesearch").style.border="0px"; return; } var xmlhttp=new XMLHttpRequest(); xmlhttp.onreadystatechange=function() { if (this.readyState==4 && this.status==200) { document.getElementById("livesearch").innerHTML=this.responseText; document.getElementById("livesearch").style.border="1px solid #A5ACB2"; } } xmlhttp.open("GET","livesearch.php?q="+str,true); xmlhttp.send(); } </script> </head> <body> <form> <input type="text" size="30" onkeyup="showResult(this.value)"> <div id="livesearch"></div> </form> </body> </html>
  4. يختلف معنى projection حسب نوع قواعد البيانات التي تقصدها في سؤالك. فبالنسبة لقواعد البيانات غير العلائقية (مثل MongoDB) يعني المصطلح projection اختيار أو فلترة بعض البيانات اللازمة لاسترجاعها بدلاً من إعادة كامل بيانات المستند. مثال: const cursor = db .collection('inventory') .find({ status: 'A' }) .project({ item: 1, status: 1 }); والتي ستعيد قيم الحقول _id و item و status حتى في حال وجود خصائص إضافية ضمن هذا المستند.
  5. ظهر البعض من هذه المشاكل في النسخ القديمة من npm والتي لم تعد مدعومة لذلك تحديث نسخة npm و node معها سيقوم بحل المشكلة، في حال لم ترغب بتحديث النسخة لديك لسبب ما من إحدى الحلول هو تنفيذ الأمر التالي: npm config set registry http://registry.npmjs.org/ ولكن بذلك ستقوم بتحميل الحزم من خلال رابط غير محمي http، لذلك قم أولاً بتجربة الأمر التالي في https: npm config set registry https://registry.npmjs.org/ أما لإجراء عملية التحديث بالشكل الصحيح، يجب عليك إزالة النسخة القديمة: sudo apt-get purge nodejs npm ثم نقوم بتنفيذ الأوامر التالية: curl -sL https://deb.nodesource.com/setup | sudo bash - sudo apt-get install -y nodejs
  6. إن الأمر npm outdated سيقوم بتحديد الحزم التي تحتاج لتحديث، والأمر npm update مرفقاً باسم الحزمة سيقوم بتحديثها. ولكن المشكلة في النسخ القديمة من مدير الحزم npm (ماقبل 5.0.0)، ففي حال قمت بتنفيذ الأمر: npm update <packageNameExample> سيقوم بتحديث الحزمة، ولكن لن يقوم بأي تعديل على رقم النسخة ضمن ملف package.json وهي مشكلة حقيقية. لذا يجب عليك التأكد من نسخة npm الموجودة لديك في حال كانت مادون النسخة الخامسة، يجب عليك تحميل المكتبة npm-check-updates ثم تنفيذ الأوامر التالية: لطباعة الحزم التي تحتاج لتحديث في مشروعك (وهي مشابهة لعمل npm outdated): npm-check-updates ثم لتحديث النسخ ضمن ملف package.json نستخدم الأمر التالي: npm-check-updates -u وأخيراً تنفيذ الأمر التالي لتحميل النسخ المحدّثة اعتماداً على ملف package.json: npm update
  7. يمكنك تخزين اللاحقة بشكل يدوي في كان كانت ثابتة مع الملفات من خلال الكود التالي: var multer = require('multer'); var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploadsFolder/') }, filename: function (req, file, cb) { cb(null, Date.now() + '.jpg') //مثال عن إضافة لاحقة } }) var upload = multer({ storage: storage }); أو يمكنك تخزين الصيغة التي تأتي مع الملف من خلال التالي: var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploadsFolder/') }, filename: function (req, file, cb) { cb(null, Date.now() + path.extname(file.originalname)) //سيتم الحصول على اللاحقة من الملف المحمّل } }) كما ينصح باستخدام mimetype للحصول على كامل الصيغة، مثال: filename: function (req, file, cb) { console.log(file.mimetype); // مثال image/jpeg
  8. إن res.render يعتمد على app.render ضمنياً، فهو ليس شيء منفصل أو جديد. ومن بعض الفروقات الأساسية بينهما: تستطيع استدعاء app.render على المستوى الأول (الجذر root) أما res.render حصراً ضمن وسيط أو مسار. يعيد app.render دوماً صفحة html ضمن callback أما res.render يعيد ذلك فقط في حال قمت بوضع callback كمعامل ثالث، أما في حال قمت باستدعاء res.render دون معامل ثالث أو callback، سيتم إرسال صفحة html إلى الزبون تلقائياً مع رسالة بالرمز 200. مثال: //باستخدام app.render app.render('index', {title: 'app.render example'}, function(err, html) { console.log(html) }); //باستخدام res.render بدون المعامل الثالث app.get('/home', function(req, res) { res.render('index', {title: 'res.render example'}) }) //باستخدام res.render مع معامل ثالث app.get('/render', function(req, res) { res.render('index', {title: 'res.render example'}, function(err, html) { console.log(html); res.send('Hello'); }) }) أما من ناحية الاستخدام فعادةً يتم استخدام app.render عند إجراء render للصفحة دون الحاجة لإرسالها إلى المستخدم من خلال http، مثل حالات قوالب البريد الالكتروني مثلاً وغيرها.
  9. يمكنك فك الضغط من خلال http نفسه عن طريق تخزين فك التشفير في buffer وإضافة الرد response إلى gunzip من خلال pipe كالتالي: var http = require("http"), zlib = require("zlib"); function getGzipped(url, callback) { var buffer_stream = []; http.get(url, function(res) { var gunzip = zlib.createGunzip(); res.pipe(gunzip); gunzip.on('data', function(data) { // إضافة الجزء الجاهز من فك التشفير إلى buffer buffer.push(data.toString()) }).on("end", function() { //تجميع الأجزاء وإرسال الرد callback(null, buffer.join("")); }).on("error", function(e) { callback(e); }) }).on('error', function(e) { callback(e) }); } getGzipped(url, function(err, result) { console.log(result); }); كما يمكنك تجنّب ذلك من خلال إضافة خيار encoding: null إلى الطلب request وبذلك ستتجنّب تحويل الجزء الذي يتم تحميله من جسم الطلب body إلى النمط string ويبقى بشكل binary buffer مثال: request = require('request'); zlib = require('zlib'); request(url, {encoding: null}, function(err, response, body){ if(response.headers['content-encoding'] == 'gzip'){ zlib.gunzip(body, function(err, dezipped) { callback(dezipped.toString()); }); } else { callback(body); } });
  10. يمكنك تخزين الأرقام العشرية في المتغيّرات ضمن الجافاسكريبت فهي تسمح بذلك: let x = 3.14; أو يمكنك استخدام الدالة ParseFloat: let x = parseFloat("10.33") حيث ستظهر النتيجة كرقم 10.33
  11. إن معظم أطر العمل من طرف المستخدم تقوم بإضافة X-Requested-With إلى ترويسة الطلب Header. وفي إطار العمل express تستطيع التأكد من أن الطلبات قادمة من خلال AJAX باستخدام الخاصية xhr كالتالي: app.get('/test', function(req, res) { var isAjax = req.xhr; ... }); أما في أطر العمل التي لا تقوم بإضافة هذه الترويسة مثل Angular، بهنا يحب عليك التأكد من أن الترويسة تستطيع قبول رد من النمط JSON أو XML كالتالي: if (req.xhr || req.headers.accept.indexOf('json') > -1) { // نقوم هنا بإرسال الرد XHR } else { // نقوم هنا بإرسال الرد الافتراضي }
  12. في حال كانت هذه الشركات تستخدم هذه اللغة، لم لا؟ لا يمكنني أنا أن أحدد قبولك طبعاً، فكل شركة لها معايير يتم فيها قياس خبرة وكفاءة الموظفين وأيضاً ما المهام التي ترغب بأن يلم بها هذا الموظف ويستطيع تنفيذها بكفاءة بهذه اللغة. يمكنك الاطلاع على بعض عروض العمل الموجودة لمبرمجي c++ على الانترنت مثلاً لأخذ نظرة عن كيف يتم طلب مبرمجي هذه اللغة وما المسؤوليات التي يتم طلبها مع هذه اللغة. أما في حال كان توجّهك لشركة بغض النظر عن لغة البرمجة، يمكنك البحث عن لغات البرمجة أو التقنيات التي تستخدمها هذه الشركة، ثم تقوية نفسك بهذه اللغات أو التقنيات.
  13. ضمن الوسم form نجد خاصيتين أساسيتين هما action و method. تقوم الخاصية action بتحديد الجهة أو الصفحة التي سيتم إرسال هذه البيانات إليها. وتقوم الخاصية method بتحديد كيف سيتم إرسال البيانات التي تمت إضافتها إلى حقول form، ولها نوعان إما POST أو GET حيث يمكن إرسال البيانات في النوع GET على شكل متغيّرات في شريط العنوان URL إلى الصفحة المطلوبة. أما في النوع POST، يتم إرسال البيانات ضمن جسم الطلب HTTP وبالتالي يتم الحصول على هذه البيانات من خلال جسم الطلب أو body الاختلافات الأساسية بين كل من النوعين GET و POST هي: في النوع GET: يتم تمرير البيانات ضمن العنوان URL بشكل أزواج name/value الطول محدود وبالتالي عدد المحارف أو البيانات التي سيتم تمريرها محدود 3000 محرف لا يتم إرسال بيانات هامّة أو حساسة ضمن هذا النوع من الطلبات يتم استخدامها في حالات عندما يريد المستخدم من حفظ صفحة نتيجة الإرسال ضمن المتصفّح للعودة للنتيجة لاحقاً (bookmark) في النوع POST: يتم تضمين بيانات حقول الإدخال form ضمن جسم الطلب وليس في شريط العنوان URL لا يوجد أي حدود لحجم البيانات التي يتم إرسالها لا يمكن حفظ النتيجة ضمن المتصفح (bookmark)
  14. يجب عليك تحديد ماهو المسار الذي ستعمل ضمنه أو ماهي المشاريع التي ستعمل عليها، فلغات وتقنيات تطوير الويب مثلاً تختلف عن تطوير تطبيقات الجوال وهي أيضاً تختلف عن تطوير تطبيقات سطح المكتب وهكذا. وحتى ضمن هذه المسارات يوجد عدّة فروع ولكل منها يتم استخدام تقنية أو لغة برمجة معيّنة لأداء مهام معيّنة. فتعدد لغات البرمجة هو بسبب أن لكل منها إيجابيات وسلبيات فيما يتعلّق ببعض الخصائص، وبالتالي يلجأ المبرمج إلى استخدام لغات البرمجة التي تساعده على إكمال مشروعه. في حال كانت لغة البرمجة لديك قادرة على تنفيذ جميع الخصائص التي ستعمل عليها، نعم يمكنك استخدام لغة برمجة واحدة وكثيراً ما نجد شركات تطلب متخصّص في لغة برمجة معيّنة وحتى بمكتبة أو حزمة برمجية معيّنة. أما بالنسبة للغة الأكثر طلباً فذلك يعود إلى المسار الوظيفي، يمكنك البحث على الانترنت مثلاً عن لغات البرمجة الأكثر طلباً في تطوير الويب وستجد مثلاً PHP و python و جافاسكريبت وغيرها..، ولكن لا يمكنك مقارنة لغة أكثر طلباً في تطوير الويب مع لغة أخرى في مجال مختلف تماماً، لأن النتيجة لن تكون دقيقة عندها. وفي النهاية لغات البرمجة والتقنيات في تحديث مستمر، ويجب عليك تحديد غايتك من استخدام لغة البرمجة وما نوعية المشاريع التي تفضّل العمل عليها قبل تحديد لغة البرمجة. ثم البقاء على اطلاع على مايجري من تحديثات في اللغة التي تستخدمها وما التقنيات التي يتم استخدامها
  15. يمكنك استخدام حلقة تكرارية for مع switch بدلاً من if فتصبح بالشكل التالي: public void convertToDecimal () { Scanner scan = new Scanner(System.in); System.out.print("Enter a Roman number: "); romanNumeral = scan.nextLine(); romanNumeral = romanNumeral.toUpperCase(); int l= romanNumeral.length(); int num=0; int previousnum = 0; for (int i=l-1;i>=0;i--) { char x = romanNumeral.charAt(i); x = Character.toUpperCase(x); switch(x) { case 'I': previousnum = num; num = 1; break; case 'V': previousnum = num; num = 5; break; case 'X': previousnum = num; num = 10; break; case 'L': previousnum = num; num = 50; break; case 'C': previousnum = num; num = 100; break; case 'D': previousnum = num; num = 500; break; case 'M': previousnum = num; num = 1000; break; } if (num<previousnum) {decimalNum= decimalNum-num;} else decimalNum= decimalNum+num; } }
  16. إن res.send بالفعل تقوم بإرسال الرد response وإغلاق الاتصال HTTP ولكن لا تقوم بإجراء أي شيء إضافي إلى الكود الذي يتبعها، حيث يمكنك إجراء أي عمليات برمجية بعد هذا السطر دون أي تأثير. ولكن لن تتمكّن من إجراء أي عمليات على الغرض res لأن الطلب تم إنهائه وإرسال الرد إلى المستخدم وبالتالي لا يمكنك إضافة أي بيانات أو معالجتها بعد إرسال هذا الرد، كما لا يمكنك إضافة أي ترويسة أو خصائص إضافية للطلب، مثلاً: res.send(...); res.write('test'); // سيعطي خطأ وإن هذا النمط مختلف عن بقية أطر العمل مثل PHP و ASP.NET وغيرها من أطر العمل التي تقوم بتعيين مسلك thread لكل طلب HTTP وتقوم بإنهاء هذا المسلك عند انتهاء الطلب. فمثلاً في حال قمت باستدعاء التابع Response.End في ASP سيقوم بإيقاف المسلك الموافق لهذا الطلب وبالتالي سيتوقف الكود البرمجي عن المتابعة. أما في node.js فلا يوجد مسلك محدد لكل طلب وبالتالي لن يتم إيقاف تنفيذ الكود الذي يتبع إرسال الطلب وإنهائه أو أي عمليات قد تجري من بعده طالما ليست متعلّقة بالعرض req و res.
  17. إن الخطأ App crashed لا يعطي أي تفاصيل عن نوع الخطأ أو ما السبب الذي أدى إلى توقّف عمل الخادم. يجب عليك قراءة ملفات logs لديك لمشاهدة الأخطاء التي يتم إظهارها من قبل مشروعك وتحديد المشكلة بشكل أدق وإعادة تشغيل الخادم من خلال: heroku restart ولكن من بعض أسباب ظهور هذه المشكلة هو كتابة المنفذ port بشكل يدوي، لأن heroku يقوم بإضافة المنفذ من قبله بشكل أوتوماتيكي، ففي حال كنت قد كتبت رقّم معيّن يجب عليك استبداله بإضافة قيمة process.env.PORT بالشكل التالي: app.listen(process.env.PORT || 5000, function(){ console.log("server running.."); }); كما في بعض الأحيان قد تحدث هذه المشكلة نتيجة سوء توافق بين نسخ الحزم أو إصدارات node.js لذلك يجب عليك التأكد من أن لديك نسخة node.js محدّثة تتوافق مع النسخة التي تم استخدامها في مشروعك والموجودة على الاستضافة: node --version وأخيراً تأكد من قيم متغيّرات البيئة لديك في حال كنت تملك أكثر من قيم لبيئة التطوير وبيئة النشر، وأي أخطاء أخرى يمكنك أن تجدها ضمن سجلات logs.
  18. ملفات تعريف الارتباط الموقّعة أو (signed) ستبقى تظهر في طرف المستخدم، إلا أنها ستكون مرفقة بتوقيع لاكتشاف في حال حاول المستخدم التعديل عليها. حيث يتم إنشاء توقيع باستخدام HMAC لقيمة ملفات تعريف الارتباط cookie value الحالية وترميزها من خلال base64 وعندما يتم قرائتها يتم قراءة هذا التوقيع وحساب التوقيع الذي تم إنشائه لهذه القيمة في حال كانا غير متطابقين أي يوجد تعديلات على قيمتها يتم إعادة خطأ. أما في حال كنت ترغب بإخفاء محتوى ملفات تعريف الارتباط فيجب عليك إما تشفير محتوياتها أو تخزينها من طرف الخادم بدلاً من طرف المستخدم، ويوجد بعض الحزم والآليات التي يمكنك اتباعها لتحقيق ذلك في express.js مثل cookie-session الموجودة ضمن التوثيق الرسمي في إطار العمل express، حيث يمكنك تحميلها بالشكل التالي: npm install cookie-session ومثال عن استخدامها من التوثيق الرسمي: var cookieSession = require('cookie-session') var express = require('express') var app = express() app.use(cookieSession({ name: 'session', keys: [/* secret keys */], maxAge: 24 * 60 * 60 * 1000 })) لإنشاء ملفات تعريف الارتباط التي يتم ارفاقها مع التوقيع signed: res.cookie('key', 'value', {signed: true}) ويتم الحصول عليها وقرائتها من خلال الغرض sigendCookie الموجود ضمن الطلب req: req.signedCookies['key']
  19. نعم ستتمكن من بناء صفحات الموقع الالكتروني (website) كما ستتعلم في دورة تطوير واجهات المستخدم التالي: مفهوم الواجهة الأماميّة للموقع front-end وكيفية عملها أساسيات لغات تطوير واجهات المستخدم: HTML و CSS و JavaScript استخدام أحدث أدوات التطوير: Bootstrap 4 و jQuery و Sass التعامل مع خدمة استضافة المشاريع البرمجية GitHub و GitLab نشر صفحات الموقع على الإنترنت إعداد هيكل الموقع ووضع خطة العمل التصميم المتجاوب مع مختلف الأجهزة والشاشات للمزيد من المعلومات حول هذه الدورة يمكنك الاطلاع على الرابط التالي (من هنا) ومشاهدة الفيديو التعريفي والاطلاع أيضاً على المشاريع التي ستعمل عليها أثناء الدورة وفي حال كان لديك أي سؤال يمكنك التواصل مع الدعم (من هنا)
  20. يمكنك التواصل مع الدعم (من هنا) أو عبر الرابط التالي: https://support.academy.hsoub.com/ وإخبارهم بأي مشكلة تواجهك وهم سيقومون بمساعدتك.
  21. نعم ولكن يوجد حل بديل مجاني باستخدام الحزمة laravel-websockets المقدّمة من beyondcode وستجد في التوثيق الرسمي للارافيل شرح ورابط لهذه الحزمة وجميع التفاصيل المتعلّقة بكيفية استخدامها وتضمينها ضمن مشروعك.
  22. بما أنك تستخدم إطار العمل express، يمكنك الحصول على محتوى app من خلال req.app التي يتم تضمينها مع كل طلب. بحيث يتم إضافة أي بيانات إضافية من خلال app.set: app.set('anykey', {}) والحصول عليها ضمن الكود يكون من خلال المتغير req الذي سيكون موجود مع كل طلب يتم ربطه بالمتحكّم الخاص به بالشكل التالي: req.app.get('anykey') كما يمكنك تعديل كود الملف الرئيسي لديك وجعل app متغيّر عام بهذا الشكل: var app = module.exports = express(); app.use(app.router); وعندها يمكنك تضمين app في الأجزاء المتفرقة من الكود لديك كالتالي: var app = require('../app'); app.get('/', function(req, res, next) { res.render('index'); }); وبشكل مشابه يمكنك بباسطة تمرير المتغيرات إلى المتحكمات لديك بهذا الشكل: var controllers = require('./controllers')({app: app}); وإنشاء واجهة عامة للمتحكمات تستقبل هذه المتغيرات: // controllers.js module.exports = function(params) { return require('controllers/index')(params); } ثم الوصول إليها يكون بهذا الشكل: // controllers/index.js function controllers(params) { var app = params.app; controllers.users = require('./users'); controllers.index = function(req, res) { ... }; } module.exports = controllers; ويمكنك الإطلاع على طريقة مشابهة من خلال استخدام locals في node.js موجودة هنا:
  23. إذا قام المستخدم بتسجيل الدخول، سيتم إنشاء الغرض user ضمن نسخة الطلب req وإرساله مع كل طلب في express.js والذي يتيح لك التأكد من وجوده أو التحقق من المعلومات الموجودة فيه من خلال أي وسيط: if (req.user) { //قام المستخدم بتسجيل الدخول } else { ... } كما يمكنك فصل عملية التحقق إلى وسيط خارجي واستدعائه عند اللزوم بالشكل التالي: function isLoggedIn(req, res, next) { if (req.user) { next(); } else { res.redirect('/login'); } } بحيث سيتم إعادة توجيه المستخدم إلى صفحة تسجيل الدخول في حال حاول الوصول إلى أي جزء من الكود البرمجي لديك يحتاج توثيق. ويمكنك استخدام الوسيط السابق بالشكل التالي: app.get('/testLogin', isLoggedIn, function(req, res, next) { ... }); بحيث سيتم الدخول إلى الوسيط والتأكد من تسجيل الدخول قبل الوصول إلى هذا الكود
  24. في حال كان المحتوى بسيط وغير معقّد يمكنك استخدام handler خاص وتضمينه بالشكل التالي: var fs = require('fs'); require.extensions['.txt'] = function (module, filename) { module.exports = fs.readFileSync(filename, 'utf8'); }; var test = require("./mytext.txt"); console.log(typeof words); حيث سيتم تخزين المحتوى النصي ضمن المتغيّر test ويمكنك استعماله في أماكن أخرى من الكود البرمجي. كما يمكنك استخدام كل من fs.readFile و require.resolve بالشكل التالي: var fs = require('fs'); function readModuleFile(path, callback) { try { var filename = require.resolve(path); fs.readFile(filename, 'utf8', callback); } catch (e) { callback(e); } } readModuleFile('./mytext.txt', function (err, result) { console.log(result); }); أو من خلال readFileSync: const fs = require('fs') const path = require('path') const mytext = fs.readFileSync(path.resolve(__dirname, 'testfile.txt'), 'utf8') وعموماً أنت لا تقوم بتخزين المحتوى النصي في المتغيّر، بل يتم الإشارة إليه ضمن ذاكرة التخزين العشوائي إلى هذا المتغيّر بشكل مشابه عندما تقوم بعملية نسخ ولصق لمحتوى ما في جهازك.
  25. تحديث البيانات من طرف المتصفح يمكن من خلال إما استخدام web sockets لفتح اتصال مع الخادم وإرسال هذه البيانات الجديدة عند استقبالها بشكل فوري ومباشر إلى المستخدم وذلك سيتطلب تهئية مناسبة للخادم لديك ووضع الإعدادات المناسبة (بحيث يتم استقبال بيانات API عند الخادم لديك وإعادة إرسالها إلى المستخدم). أما الحل الثاني والذي لا ينصح به في حال كانت الموارد محدودة على استضافة خادم الويب لديك، وهو طلب هذه البيانات بشكل مباشر من المتصفح كل مدة زمنية معيّنة من خلال استخدام AJAX أو axios مثلاً مع set interval، بحيث يتم إرسال طلب إلى الخادم كل 5 دقائق للتحقق من وجود بيانات جديدة، وفي حال وجودها يتم استقبالها في المتصفح وتحديثها ضمن الصفحة. لا أعلم إن فهمت سؤالك بالشكل الصحيح، ولكن يمكنك إرفاق أجزاء الكود وما تحاول تحقيقه بالتفصيل لنتمكّن من مساعدتك بشكل أفضل.
×
×
  • أضف...