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

Sam Ahw

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

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

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

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

    16

إجابات الأسئلة

  1. إجابة Sam Ahw سؤال في مشكلة في الوصول إلى ملفات تعريف الارتباط بطرف المستخدم في node.js كانت الإجابة المقبولة   
    يقوم إطار العمل express تلقائياً بوضع قيمة الخيار httpOnly إلى true، وبالتالي تصبح ملفات تعريف الارتباط هذه غير قابلة للوصول من طرف الزبون (الجافاسكريبت من خلال المتصفح).
    لجعل ملفات تعريف الارتباط قابلة للوصول من قبل كود الجافاسكريبت من طرف الزبون يجب تعديل الكود لديك ليصبح بالشكل التالي:
    res.cookie('testcookie', 'hello', { maxAge: 900000, httpOnly: false}); ويجب أيضاً الانتباه إلى نوع الاتصال لديك في حال كان http أو https والقيام بالتعديل المطلوب على الكود بإضافة القيمة secure إما true لـ https أو false ل: http بالشكل الموافق:
    res.cookie("testcookie", "hello", { secure:true, maxAge:120000, httpOnly: true });  
  2. إجابة Sam Ahw سؤال في تفريغ البيانات من حقل في جدول بقاعدة البيانات كانت الإجابة المقبولة   
    المفهوم من كلمة تفريغ هنا هو إما وضع قيمة فارغة '' أو القيمة NULL داخل هذا الحقل بما أنه من نمط سلسلة نصية أو string بحسب الاستعلام لديك sss، أي بأن تصبح قيمة الحقل:
    verification_key='' أو verification_key=NULL وذلك يعتمد على النمط المسموح في هذا الحقل بجدول قاعدة البيانات لديك. ويمكنك تحقيق ذلك بإجراء أمر التعديل نفسه ضمن الشرط مع وضع إحدى القيم السابقة.
    $key = null; $stmt = $db->prepare("UPDATE accounts SET verification_key=? WHERE verification_key=?"); $stmt->bind_param('ss',$key,$_SESSION['verification_code']); في حال كان غير مسموح وضع القيم Null يمكنك إما تغييرها في قاعدة البيانات أو استبدالها بالقيمة الفارغة ''
  3. إجابة Sam Ahw سؤال في ما الفرق بين res.header و res.setHeader في node.js كانت الإجابة المقبولة   
    إن التابع res.setHeader هو أساسي في بيئة node.js، و res.header هو اختصار للتابع res.set الموجود في إطار عمل express.js
    وكلا الطريقتين لهما نفس النتيجة وهي إضافة ترويسات إلى طلبات HTTP، الفرق الوحيد بينهما هو أن res.setHeader تسمح لك بإضافة ترويسة واحدة فقط في كل مرة، مثال:
    res.setHeader('content-type', 'application/json'); وفي حال أردت إضافة أكثر من خاصية إلى الترويسة نفسها ستحتاج إعادة كتابة التابع السابق عدة مرات:
    res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept ... أما res.header تسمح لك بإضافة أكثر من ترويسة بنفس الوقت، مثال:
    res.set({ 'content-type': 'application/json', 'content-length': '500', 'warning': "show warning in this header" }); أما بالنسبة لسماحية CORS فيمكنك تطبيق ذلك من خلال كل منهما بنفس النتيجة.
  4. إجابة Sam Ahw سؤال في تمرير القيم من خلال locals في express ضمن node.js كانت الإجابة المقبولة   
    بدءً من الإصدار الثالث في express لقد تم الاستغناء عن dynamicHelpers وبالتالي لم يعد بالإمكان استخدام الطريقة السابقة، بدلاً من ذلك يمكنك استخدام التابع app.locals والذي يمكنه تخزين جميع القيم والتوابع التي قد تحتاجها ضمن أجزاء الكود لديك حتى لو كانت بأماكن متفرّقة في حال لم تستخدم طرق الاستدعاء التقليدية require أو تصدير modules.
    مثال:
    app.locals.title = "test"; --> يمكنك تخزين قيم مفردة //كما يمكنك تخزين توابع مع قيمها أيضاً بالشكل التالي: app.locals({ username: "user1", somefunction: function() { return "any result"; } }); وبالتالي يمكنك في أي مكان ضمن الكود استدعاء app.locals وأي قيم تحتويها:
    var user = app.locals.username أما بالإصدار الرابع من express.js 4 ، أصبح المتغيّر app.locals ببساطة كغرض Object من لغة جافاسكريبت بدلاً من أن يكون بهيئة تابع، وأصبح يجب عليك إضافة الخصائص كما تقوم عادةً بتعريفها للأغراض Objects كلٍ على حدى، بالشكل التالي:
    app.locals.username = "user1"; app.locals.somefunction = function() { return "result here"; } وأصبح أيضاً بالإمكان استخدام res.locals والتي لها نفس الوظيفة تماماً مع فرق بسيط أنه يجب استخدامها مع البيانات المتعلّقة بالطلبات التي يتم استقبالها وإرسالها من خلال express بدلاً من أي بيانات عامة ضمن الكود لديك.
    مثال:
    res.locals.user = req.isAuthenticated() ? req.user : null;  
  5. إجابة Sam Ahw سؤال في ظهور الخطأ CERT_HAS_EXPIRED في express - node.js كانت الإجابة المقبولة   
    إن تعطيل HTTPS / SSL / TLS خطير جداً، يمكنك استخدام agent مع rejectUnauthorized وبذلك يتم التعطيل على مستوى الطلب التابع لهذا الموقع بدلاً من تعطيل الفحص على البيئة بأكملها وهو أكثر أماناً:
    var request = require('request'); const options = { host: 'www.example.com' , port: '443' , path: '/' , rejectUnauthorized: false }; const agent = new https.Agent(options); request({ url: "https://www.example.com/api/users" , method: 'GET' , agent: agent }, function (err, resp, body) { // ... }); أما في حال كنت تستخدم شهادة موقّعة ضمنياً، يمكنك إضافة التالي إلى العميل agent:
    options.ca = [ selfSignedRootCaPemCrtBuffer ];  
  6. إجابة Sam Ahw سؤال في ظهور body فارغ في طلبات من نوع post في node.js كانت الإجابة المقبولة   
    إن الوسيط body-parser يقوم فقط بالتعامل مع البيانات من نمط JSON و urlencoded data، ولا يستطيع معالجة البيانات في حال كانت من الشكل multipart على سبيل المثال الفورم الذي يحوي أي صور أو ملفات مع بيانات أخرى.
    ولكن بدءً من النسخ الحديثة من express أصبح body-parser مبني ضمنياً ضمنه ولا داعي لوضع السطر السابق في الكود الخاص بتعريف خادم الويب لديك. لذلك يمكنك اختصار هذه المرحلة.
    يمكنك بدلاً من ذلك استخدام التالي:
    app.use(express.json()); وعندها سيتم التعامل مع النسخة الحديثة من JSON bodies.
    أما للمسارات المرمزة من خلال الجسم body ضمن الطلب وفي مثالنا الطلبات من نوع Post بنمط HTTP، يمكنك وضع السطر التالي ضمن الكود:
    app.use(express.urlencoded()) أما في حال كانت الطلبات مقتصرة على postman دون وجود كود برمجي كامل (طرف الخادم + طرف العميل من خلال ajax أو غيرها من التقنيات)، يمكنك تحديد النوع raw ضمن الطلب وإضافة التالي ضمن الخيارات:
    Content-Type: application/json ثم يمكنك كتابة البيانات المراد تمريرها إلى الخادم مع التأكد من إحاطة اسماء المتغيرات بعلامة تنصيص مزدوجة والمحافظة على هيئة json وإلا لن يتم إرسال الطلب بالشكل الصحيح:
    { "name": "test" } أما في الحالات التي يتم فيها استخدام بيانات mutlipart، وفي حال كنت تستخدم وسيط مثلاً لرفع الملفات كما هو الحال في multer في node.js، يجب عليك التأكد من تعريف الوسيط وخصائصه بالشكل الصحيح واستخدامه قبل طباعة محتوى الطلب وإلا ستحصل أيضاً على body فارغ حتى لو قمت بتطبيق جميع الطرق السابقة.
  7. إجابة Sam Ahw سؤال في الحصول على المسار الكامل من خلال express في node.js كانت الإجابة المقبولة   
    نحصل على هذه المعلومات وغيرها من خلال الطلب نفسه req الذي يقوم بتفسيره إطار العمل express مما يمكننا من استخدامه بشكل مباشر ضمن الكود.
    يتم الوصول إلى البروتوكول المستخدم في الاتصال عبر express من خلال:
    req.protocol أما قبل النسخة الثالثة من express فيكون البروتوكول ثابت دوماً كـ http إلا إذا تم ذكر السطر البرمجي التالي ضمن الكود بالتالي سيكون https:
    req.get('X-Forwarded-Protocol') أما المضيف host فيمكن الحصول عليه من خلال:
    req.get('host') وفي حال لم ترغب بتجميع هذه العناصر مع بعضها البعض، يمكنك ببساطة استخدام API الذي يقدمها node.js الخاصة بالمسارات بالشكل التالي:
    var url = require('url'); function getFullURL(req) { return url.format({ protocol: req.protocol, host: req.get('host'), pathname: req.originalUrl }); } وبعدها يمكنك استدعاء التابع السابق بشكل مباشر عند الحاجة.
     
  8. إجابة Sam Ahw سؤال في استخراج عدد من المستندات إلى مجموعة أخرى في mongodb كانت الإجابة المقبولة   
    يمكن إجراء ذلك من خلال الكود البرمجي عن طريق تنفيذ عمليات الإدخال إلى المجموعة الجديدة ضمن حلقة تكرارية، ويمكنك وضع الشرط المناسب ضمن الاستعلام في هذه الحلقة، مثال مبسّط:
    find({date:"2020-12-12"}).forEach(function(doc){ db.newColl.insert(doc); }); بحيث يتم إضافة هذه المستندات المحققة للشرط على المجموعة الجديدة newColl.
    ومن خلال الإصدارات الجديدة ل mongodb أصبح بإمكانك تنفيذ ذلك ضمن shell نفسها من خلال استخدام خاصية التجميع aggregation والمعامل out بالشكل التالي:
    db.originalCol.aggregate([ { $match: { date: "2020-12-12" } }, { $out: "newCollection" } ])  
  9. إجابة Sam Ahw سؤال في ظهور الخطأ ERR! code EINTEGRITY في node.js كانت الإجابة المقبولة   
    من الممكن أن تكون المشكلة متعلّقة بال cache ل NPM الموجود لديك، لذلك يمكنك تجربة تنفيذ الأمر التالي أولاً:
    npm cache verify ثم إعادة تنفيذ أمر التحميل من جديد:
    npm install والتأكد من إزالة package-lock.json ضمن المشروع كما يمكنك تجربة الأمر التالي:
    npm cache clean --force وفي حال لم تنفع الأوامر السابقة، في نظام تشغيل ويندوز يمكنك التوجه إلى المسار التالي:
    Users%username%\AppData\Roaming وإزالة المجلّد npm والمجلّد npm-cache، ثم إعادة تحميل npm من جديد.
    كما يمكنك البحث عن المشكلة مع نسخة الإصدار لديك على الإصدار الرسمي في github فلقد تمت معالجة المشكلة بأساليب مختلفة حسب النسخة المستخدمة.
  10. إجابة Sam Ahw سؤال في تمرير المتغيرات ضمن محرر الأوامر mongodb shell كانت الإجابة المقبولة   
    يمكنك استخدام المتغيرات العامة global variable ضمن نفس الأمر في محرر الأوامر بالشكل التالي:
    ./mongo --nodb --quiet --eval "var t1=10, t2=20" testfile.js بحيث سيتم تمرير قيم كل من t1,t2 من خلال الملف testfile.js
    ومن الممكن أيضاً وضع أي قيم ضمن ملف جافاسكريبت منفصل والقيام باستدعائه أولاً:
    // ضمن الملف vars.js var1 = "test"; ثم يتم الاستدعاء بالشكل التالي:
    mongo vars.js targetFile.js MongoDB shell version: blah connecting to: ... loading file: vars.js loading file: targetFile.js test  
  11. إجابة Sam Ahw سؤال في تشغيل خادم mongodb ضمن حاويات docker كانت الإجابة المقبولة   
    بإمكانك تشغيل محرر mongodb shell والذي يمكنك من كتابة الأوامر بشكل مباشر من خلال تنفيذ الأمر التالي مع الحاوية:
    docker run -it -p 28000:27017 --name mongoContainer mongo:latest mongo أما في حال كان لديك نسخة الحاوية قيد التشغيل، يجب عليك تنفيذ exec معها بالشكل التالي:
    docker exec -it mongoContainer mongo كما يمكنك استخدام pull mongo وتشغيلها مع حاوية خاصة بتنفيذ سلسلة الأوامر التالية:
    docker pull mongo docker run --name your_container_name --restart=always -d -p 8080:8080 mongo mongod --auth sudo docker exec -i -t your_container_name bash وبعدها يمكنك الاتصال كالتالي:
    mongo use admin db.createUser({user:"user", pwd:"password", roles:[{role:"root", db:"admin"}]}) exit && exit الآن يمكنك إجراء أي عمليات على هذه الحاوية من خلال إجراء الاتصال كالتالي:
    mongo -u "user" -p "password" HOSTIP --authenticationDatabase "admin"  
  12. إجابة Sam Ahw سؤال في تحديد اسماء الحقول في $addToSet ضمن mongodb كانت الإجابة المقبولة   
    من أبسط الطرق التي يمكنك استخدامها هي منع الإضافة أو التحديث في حال وجود القيمة username ضمن المصفوفة:
    update( {_id: id, 'users.username': {$ne: 'some_value_here'}}, {$push: {users: {'name': 'some_value_here', 'value': 11}}}) بحيث يتم أولاً إجراء استعلام على المستندات التي لا تحوي هذه القيمة ضمن الحقل username وبعدها تتم الإضافة، أما في حال وجود أي مستند يحوي هذه القيمة فلن يتحقق الاستعلام وبالتالي لن تتم الإضافة على المجموعة.
  13. إجابة Sam Ahw سؤال في ما الفرق بين التجزئة sharding والتكرار replication في mongodb؟ كانت الإجابة المقبولة   
    التكرار أو replication، وهو كما يشير الاسم إلى إنشاء نسخة من البيانات الموجودة والسماح بتحريك هذه النسخة إلى عقد أخرى متصلة مع العقدة الأساسية بين قواعد البيانات، وبالتالي يساعد هذا المفهوم على توسيع نظام قواعد البيانات لديك وتحاشي الأخطاء بإتاحة القدرة دوماً على الوصول إلى البيانات حتى في حال هبوط عقدة ما من بين العقد الموجودة.
    ولكن يجب الانتباه إلى أن البيانات في هذه الحالة لن تكون بالضرورة هي النسخة الأحدث، ويمكن حصول تأخير في تحديث هذه النسخ تبعاً للإعدادات التي تم تهيئة هذه البيئة بها. (وهو مشابه للمفهوم master/slave والمتعارف عليه في قواعد بيانات mySql وغيرها).
    أما التجزئة أو sharding: تسمح بتجزئة البيانات التي يتم إدخالها من خلال عمليات الكتابة writes إلى عدد من العقد التي تتشارك فيما بينها بمفتاح shard key. وبالتالي ليس بالضرورة تكرار نفس البيانات بين العقد بل وضع كل جزء من هذه البيانات على عقدة. أي عكس المفهوم السابق والذي يتم فيه تكرار نفس البيانات بين عقد مختلفة.
    في mogodb تعد آلية التجزئة أكثر تعقيداً لأنه يجب على خادم قواعد البيانات أن يقوم بإدارة هذه العمليات (عمليات التجزئة) وتوزيع البيانات والطلبات بين العقد. لذلك قد يأخذ وقت أكبر لتهيئة هذه البنية وإنشاء المسارات اللازمة لهذه العمليات.
    ولكن يتم استخدام كل منهما معاً لإنشاء مايدعى بـ sharded cluster بحيث يكون كل جزء مدعوم من قبل replica set مستقلة. ولكن تختلف حالات الاستخدام حسب الحالة لديك وطبيعة النظام والبيانات التي سيتم إجراء عمليات الكتابة والقراءة عليها.
    فاختيار البنية المناسبة يعود للعديد من العوامل ومنها: نسبة عمليات القراءة إلى عمليات الكتابة، أماكن وجود وتوزّع العقد، تأثيرها على الأداء،...وغيرها الكثير. وبعد جمع وتحليل هذه العوامل يمكنك اختيار المنهجية الأفضل لك.
     
  14. إجابة Sam Ahw سؤال في ما هي وظيفة "use strict" عند إضافتها في ملفات node.js كانت الإجابة المقبولة   
    لقد تم إحداث هذه الخاصية في ECMAScript النسخة الخامسة. ويتم إهمالها من قبل النسخ القديمة من الجافاسكريبت.
    ومن إحدى أهم مزاياها هو أنك لا تستطيع استخدام المتغيّرات التي لم يتم التصريح عنها، ولعلّها تساعد المبرمجين بعدم ارتكاب بعض الأخطاء وتسهّل الوصول إلى الأخطاء عند حدوثها.
    مثال:
    "use strict"; x = 3.14; // سيسبب خطأ لأنه لم يتم التصريح مسبقاً عن المتغيّر يجب أن تكون بالشكل التالي: "use strict"; let x = 3.14; في الوضع غير المقيد (أي عند عدم وضع use strict) ، ستكون المتغيرات والتي يمكن الوصول إليها داخل أي دالة عبارة عن مصفوفة مثل الكائن Object على سبيل المثال والذي يحتوي على جميع المعاملات التي يتم تمريرها له عادةً، ستكون هذه المعاملات الموجودة داخلها مراجع إلى نفس القيم المخزنة في تعريف الوظيفة.
    مثلاً عند تعريف دالة ما تحوي بارامتر واحد وليكن اسمه myArg، سنتمكّن من الوصول إلى هذا المتغير إما من خلال اسمه muArg أو من خلال المصفوفة arguments[0] وعندما نقوم بتغيّر قيمته من خلال هذه المصفوفة ستقوم أيضاً بتغيير قيمته التابعة للاسم نفسه:
    function myFunc(myArg) { console.log(`${myArg} -- ${arguments[0]}`); arguments[0] = 20; // نقوم هنا بتغيير قيمته من خلال مصفوفة المتغيرات console.log(`${myArg} -- ${arguments[0]}`); } test(10); سنلاحظ هنا أن النتيجة نفسها لكل من مصفوفة المتغيّرات، وأيضاً اسم المتغيّر أو reference:
    10 -- 10 20 -- 20 أما إذا قمنا بكتابة use strict وأعدنا تنفيذ هذا التابع:
    'use strict'; // قمنا هنا بإضافة use strict function myFunc(myArg) { console.log(`${myArg} -- ${arguments[0]}`); arguments[0] = 20; console.log(`${myArg} -- ${arguments[0]}`); } test(10); سنلاحظ أنه حتى لو غيّرنا قيمة المتغيّر من خلال المصفوفة، فإن ذلك لن يؤثر فعلياً على قيمة المتغيّر نفسه المحجوز في الذاكرة. وعندما نقوم باستدعائه من خلال اسم المتغيّر أو reference سنلاحظ أن قيمته لم تتغيّر واحتفظت بالقيمة نفسها، فيكون الناتج:
    10 -- 10 10 -- 20 ^^  
  15. إجابة Sam Ahw سؤال في ظهور خطأ Error: timeout of 2000ms exceeded عند اختبار mocha في node.js كانت الإجابة المقبولة   
    إن الزمن الافتراضي timeout هو 200 ميلي ثانية، ولكن بإمكانك تغيير timeout limit عند القيام بالاختبار من خلال الأمر نفسه بإضافة الخيار --timeout كالتالي:
    mocha --timeout 15000 مع تجربة الزمن المناسب لعملياتك.
    أو: يمكنك وضع التابع الزمني ضمن كل اختبار على حدى، بالشكل التالي:
    describe('your test here', function(){ this.timeout(15000); it('test', function(done){ this.timeout(15000); setTimeout(done, 15000); }); }); بشكل مماثل يمكنك التحكّم بتعديل timeouts على مستوى suit, hook, test وغيرها من الخصائص التي يمكنك الاطلاع عليها من خلال التوثيق الرسمي لـ mocha
  16. إجابة Sam Ahw سؤال في ظهور خطأ Failed to unlink socket file عند تشغيل mongodb على نظام Ubuntu كانت الإجابة المقبولة   
    قد يظهر هذا الخطأ نتيجة لعدة أسباب، ومن الممكن أن حذف الملف mongodb-27017.sock ألا يحل المشكلة في بعض الأحيان.
    يجب عليك أولاً إعطاء الصلاحيات اللازمة من خلال الأمر التالي:
    sudo chown `whoami` /tmp/mongodb-27017.sock لأنه قد يظهر هذا الخطأ أحياناً نتيجة لتنفيذ الأمر mongod قبل تنفيذ الأمر التالي:
    sudo service mongod start لذلك عندها من الممكن أن يحل حذف الملف المشكلة وبعدها يمكنك تشغيل mongodb من خلال الأمر التالي:
    sudo service mongod start && mongod  
  17. إجابة Sam Ahw سؤال في الحصول على محتويات مجلّد في node.js كانت الإجابة المقبولة   
    يمكنك بشكل مختصر استخدام  readdirSync  من المكتبة fs ضمن node.js بالشكل التالي:
    بما أنه يمكن الوصول إلى المجلّد الأساسي وليكن اسمه target_folder:
    const { readdirSync } = require('fs') const all_directories = target_folder => readdirSync(target_folder, { withFileTypes: true }) .filter(e => e.isDirectory()) .map(e => e.name) بحيث تمكننا المكتبة من اختبار محتويات المجلّد في حال كانت مجلّدات أيضاً (أو فيها محتويات أخرى) ونقوم بإعادة اسم هذا العنصر وتجميعها ضمن المتغيّر النهائي: all_directories
    ولكن يجب عليك الانتباه إلى الحصول على المسار المطلق absolute بالشكل التالي:
    require('path').resolve(__dirname, file)  
  18. إجابة Sam Ahw سؤال في مشكلة عدم تحميل devDependencies في node.js كانت الإجابة المقبولة   
    تأكد من إعدادات npm من خلال npm config، ففي حال كانت قيمة production هي true، سيقوم بتجاهل dev depencencies بشكل دائم. أو حتى في حال كان لديك المتغيّر NODE_ENV يساوي production.
    يمكنك تشغيل الأمر التالي:
    npm config get production ولتغيير القيمة إلى false:
    npm config set -g production false من المحتمل في بعض الأحيان في حال قمت بنسخ ملفات من مشروع آخر أن يتواجد بعض الإعدادات المحفوظة ضمن الملف package-lock.json، في حال كان يحوي قيم production أيضاً يجب عليك حذف هذا الملف وسيتم إعادة توليده عند عملية التحميل التالية.
    كما ويمكنك تجربة الاختصار التالي للتحميل بوضع العلامة -D:
    npm i -D <names>  
  19. إجابة Sam Ahw سؤال في مشكلة اختلاف التوقيت ضمن mongoose في mongodb كانت الإجابة المقبولة   
    إن timestamps في mongodb هي ثابتة ومرتبطة بشكل مباشر بتوقيت unix. أما عند التعامل معها مع الكود البرمجي مثلاً node.js يقوم المفسّر في node بأخذ قيمة التاريخ حسب timezone الجهاز الذي يقوم بالتنفيذ عليه. مثلاً في حال كانت منطقتك الزمنية UTC+2 وهكذا.
    لذلك قد تجد اختلاف بين القيمة التي يتم تخزينها في mongodb والقيمة التي يتم إظهارها ضمن node.js
    لذلك يمكن معالجة هذه المشكلة إما بالتعامل دوماً مع التوقيت حسب Unix كمرجع ثابت للتوقيت بين قاعدة البيانات وخادم الويب لديك، أو عن طريق تعديل التوقيت بالشكل المناسب لك (أخذ منطقتك الزمنية على سبيل المثال كمرجع ثابت) وحفظها أثناء إدخال البيانات إلى القاعدة.
    ولتحقيق ذلك تم إيجاد عدة حلول، منها مكتبة يمكنك إضافتها لتعمل مع mogoose وتدعى moment-timezone ويمكنك استخدامها كالتالي:
    const moment = require('moment-timezone'); const myDate = moment.tz(Date.now(), "نضع هنا المنطقة الزمنية"); ثم في ال schema نكتبها بالشكل التالي:
    const someSchema = new Schema( { ... anyDate: {type: Date, default: myDate}, ... } ); ولمعرفة اسماء المناطق الزمنية يمكنك التوجه إلى التوثيق الرسمي ل moment js.
  20. إجابة Sam Ahw سؤال في كيف أقوم بنسخ المجموعات من قاعدة بيانات إلى أخرى في mongodb؟ كانت الإجابة المقبولة   
    يمكنك إجراء mongodump على المجموعة في قاعدة البيانات الأولى (المصدر) ثم استعادتها ضمن قاعدة البيانات الثانية (الهدف) من خلال mongorestore، بالشكل التالي:
    mongodump -d sourceDatabase -c yourCollectionName ولاستعادتها:
    mongorestore -d destDb -c collectionName dump/collectionName.bson حيث باتباع هذه الطريقة يمكنك الاستفادة من الضغط zip وفك الضغط scp في حال كانت المجموعة كبيرة الحجم:
    zip db.zip db/* -r أما في حال كنت تستخدم أي لغة برمجة، يمكنك إجراء عملية النسخ بشكل مبسّط جداً من خلال حلقة تكرارية ومصفوفة يمكنك استخدامها أينما ترغب.
  21. إجابة Sam Ahw سؤال في ظهور خطأ Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN في node.js كانت الإجابة المقبولة   
    يجب عليك تحديث النسخة الحالية من npm من خلال:
    npm install npm -g --ca="" أو في حال أردت إبقاء النسخة الحالية، يجب عليك تنفيذ الأمر التالي والذي يقوم بإخبار npm باستخدام مسجلات معروفة known registars:
    npm config set ca "" كما يمكنك أيضاً العودة إلى التوثيق الرسمي وقراءة بعض الخطوات التي تم شرحها ليتم تطبيقها ضمن مختلف البيئات فيما يتعلق بالتحديث و self signed certificates.
    من الحلول الأخرى أيضاً: تحديث node.js وتحديث npm بشكل عام:
    npm update npm -g أو يمكنك تغيير رابط الحصول على المسجلات إلى http بالشكل التالي:
    npm config set registry="http://registry.npmjs.org/"  
  22. إجابة Sam Ahw سؤال في نشر موقع مبني ضمن node.js يحوي بعض صفحات PHP كانت الإجابة المقبولة   
    يمكنك استخدام apache في تخديم صفحات PHP الموجودة في مشروعك من خلال استخدام proxyPass ضمن ملف httpd.conf في apache والتي ستقوم باستقبال جميع الطلبات من مسار محدد وتوجّهه إلى مشروعك:
    ProxyPass /project http://localhost:8000 ثم يجب عليك إزالة التعليق من الأسطر التالية:
    LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so وبعدها سيتم إعادة توجيه أي طلبات من المسار project إلى مشروعك المبني ضمن node.js والذي يجب أن يكون أيضاً على نفس المنفذ الذي قمنا بتعريفه ضمن proxyPass:
    var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Node js back-end is running, port = 8000 '); }).listen(8000, '127.0.0.1'); أما بقية الطلبات والتي هي تابعة إلى PHP فسيتم تخديمها من قبل Apache
  23. إجابة Sam Ahw سؤال في مشكلة أثناء الاتصال بخادم mongodb بسبب كلمة المرور كانت الإجابة المقبولة   
    يمكنك استبدال الإشارات في حال وجودها ضمن اسم المستخدم أو كلمة المرور بالترميز الذي يدل عليها.
    على سبيل المثال، يمكنك كتابة الرمز (%40) بدلاً من @ ضمن كلمة المرور فيصبح الاتصال على الشكل التالي:
    //بفرض كلمة المرور هي my@password mongoClient.connect("mongodb://username:my%40pssword@host:port/dbname?authSource=admin", { useNewUrlParser: true }, function(err, db) { } ); وفي حال كنت تستخدم node.js يجب عليك أيضاً تمرير التالي ضمن تابع الاتصال:
    {uri_decode_auth: true} أما الاتصال عن طريق mongoose فمكن أن يتم بالشكل التالي:
    mongoose.connect('mongodb://localhost/mydatabase', {user: 'usr', pass: 'any@password@'}, callback);  
  24. إجابة Sam Ahw سؤال في حفظ نتيجة الاستعلام من موجه الأوامر إلى ملف في mongodb كانت الإجابة المقبولة   
    بما أن محرر الأوامر في mongodb تفاعلي يمكنك إجراء الأوامر التالية:
    mongo dbname << EOF > output.json db.collection.find().pretty() EOF أو بإمكانك الاستفادة من جافاسكريبت لأخذ نتيجة find وتحويلها إلى JSON:
    mongo dbname mongoCommands.js > output.json بعد أن يتم وضع الأمر ضمن الملف mongoCommands.js كالتالي:
    printjson( db.collection.find().toArray() )  
  25. إجابة Sam Ahw سؤال في استخدام spawn في node.js كانت الإجابة المقبولة   
    لقد قمت بتمرير المتغيرات إلى للدالة spawn بشكل غير صحيح. قمن التوثيق الرسمي الدالة spawn لها الشكل التالي:
    spawn( command, args, options ) والتي تقوم بإنشاء عملية جديدة مع تمرير المتغيرات. والمتغيّرات args لها القيمة (مصفوفة فارغة) بشكل افتراضي. أما المتغيّر الثالث options يستخدم لتمرير خصائص إضافية لهذه الدالة والتي تكون قيمتها بشكل افتراضي كالتالي:
    { cwd: undefined, env: process.env } لذلك في حالتك يجب تمرير القيم كخصائص ضمن env في مكان المتغيّر options وليس args، بحيث تصبح كالتالي:
    spawn( 'node', ['server.js'], { env: { ...process.env, NODE_ENV: 'test' } }}) بحيث يتم استخدام spread operator أو (...) لأخذ بقية القيم من process.env
    أو يمكنك بشكل مماثل تعريف متغيرات البيئة والدلالة عليها كالتالي:
    var productionEnv = process.env; productionEnv.NODE_ENV = 'production';  
×
×
  • أضف...