-
المساهمات
1388 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
16
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Sam Ahw
-
لقد تم ذكرها أيضاً في التوثيق الرسمي أنه يجب عليك استخدام use Illuminate\Contracts\Auth\MustVerifyEmail أيضاً في المودل الخاص بالمستخدم كالتالي: use Illuminate\Contracts\Auth\MustVerifyEmail; class User extends extends Eloquent implements AuthenticatableContract,CanResetPasswordContract, MustVerifyEmail { // ... } كما يجب عليك التأكد من وجود الحقل email_verified_at ضمن مستند المستخدم، وعندها سيقوم لارافيل بإرسال البريد الالكتروني لأي مستخدم يقوم بالتسجيل في الموقع. كما يمكنك الاطلاع على عملية التحقق من البريد الالكتروني الموجودة في الملف Auth\VerificationController والتي يمكنك من خلالها تسجيل مسارات للتحقق جديدة من خلال تمرير الخيار verify كالتالي: Auth::routes(['verify' => true]); أرجو منك قراءة التوثيق الرسمي في لارافيل فهو يحوي جميع هذه التفاصيل بالإضافة لتفاصيل أخرى قد تحتاجها. بالتوفيق.
- 5 اجابة
-
- 1
-
في حال كان الموقع صغير الحجم والمحتوى بداخله ثابت (ٍStatic) أي لا يتم التواصل مع طرف الخادم لجلب المعلومات، يمكنك استخدام خاصيات الإخفاء والإظهار للنصوص التي تدعمها CSS مع تكرار نفس الصفحة لكل لغة: display: block display: none مثال بسيط: <html> <head> <style type="text/css"> body.fr > p[lang=en] { display: none; } body.en > p[lang=fr] { display: none; } </style> </head> <body class="en"> <button onclick="document.body.className='en'">English</button> <button onclick="document.body.className='fr'">French</button> <p lang="en">English text here</p> <p lang="fr">French text here</p> </body> </html> ولكن لا أعتقد أنها طريقة عملية خصوصاً في حال وجود كم كبير من النصوص والعناصر. ولا أعتقد أيضاً أنه يوجد أي طريقة عملية بالاعتماد فقط على HTML و CSS. كما أنه لن يتم حفظ اللغة التي سيختارها المستخدم في المتصفح وبالتالي عند أي عملية انتقال من صفحة لأخرى سيتم إعادة تعيين النصوص كما كانت. باستخدام الجافاسكريبت ستصبح المهمّة أسهل بكثير، حيث يمكننا تخزين اللغة التي اختارها المستخدم ضمن المتصفح localStorage و sessionStorage وأيضاً ستتيح لنا العديد من الطرق للتغيير بين هذه اللغات، ومن أبسط هذه الطرق هو جمع المحتوى النصي في ملفات JSON وتغيير المحتوى بناءً على اللغة التي تم اختيارها
- 4 اجابة
-
- 1
-
يخبرك الخطأ بأنه يجب أن تقوم بتضمين واجهة CanResetPassword ضمن مودل المستخدم، وفي التوثيق الرسمي في لارافيل تجد هذه المعلومات في القسم Resetting Passwords ضمن Database Considerations، فيصبح الكود في User.php لديك بشكل مشابه للتالي: use Illuminate\Auth\Authenticatable; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; use Illuminate\Auth\Passwords\CanResetPassword; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; class User extends Eloquent implements AuthenticatableContract,CanResetPasswordContract { use Authenticatable, CanResetPassword; ... }
- 5 اجابة
-
- 1
-
نعم لا يوجد أي مشكلة باستخدام قاعدة بيانات mogodb مع laravel، ويمكنك الاطلاع على بعض الأمثلة الموجودة ضمن التوثيق الرسمي ل mongodb عن كيفية استخدامها بالشكل الصحيح مع إطار العمل Laravel. ومن ناحية استخدام الاستعلامات لن تجد فرق كبير بما أنك تستخدم Eloquent الموجود في لارافل لأن الحزمة jessegers/mongodb تمكنك من استخدام Eloquent أيضاً، أما من ناحية بعض العمليات مثل reset password وغيرها، فيمكنك أيضاً إجرائها بشكل مماثل على mongodb ولكن يجب عليك التأكد من اسماء الحقول التي ستقوم بتعريفها ضمن schema وأيضاً أنماط هذه البيانات، فهنا يجب عليك التأكد من وضع أنماط صحيحة وإلا ستواجه العديد من المشاكل بسبب مرونة هذا النوع من قواعد البيانات ولن تكتشف الخطأ بسهولة. وبما أنك تستخدم الحزمة jessegers/mongodb باستطاعتك استخدام Authenticable base model والذي سيقوم باستبدال Illuminate\Foundation\Auth\User الافتراضي الموجود في لارافيل ليتوافق مع مستند المستخدم الذي ستقوم بتعريفه: use Jenssegers\Mongodb\Auth\User as Authenticatable; class User extends Authenticatable { .... } كما يمكنك التحكّم بتغيير اسماء الحقول عن الاسماء الافتراضية في حال احتجت ذلك لإتمام بعض الوظائف، مثلاً ضمن عملية إعادة تعيين كلمة المرور في ملف Auth/ResetsPasswordController.php يمكنك تغيير اسماء الحقول لتتناسب مع الاسماء التي قمت بتعريفها في بنية schema لديك كالتالي: protected function credentials(Request $request) { $data = $request->only( 'password', 'password_confirmation', 'token' ); $data['userEmail'] = $request->get('email'); return $data; } ويمكنك إيجاد بعض الأمثلة على الانترنت في حال واجهت أي مشكلة في تطبيق بعض الخصائص
- 5 اجابة
-
- 1
-
الطريقة الصحيحة لتشغيل المشروع في express 4 في حالتك هي بتنفيذ الأمر التالي بدلاً من node app.js: npm start وفي حال كنت ترغب بالاستغناء عن عملية الفصل هذه التي حدثت في النسخة الرابعة والعودة للطريقة المتّبعة في النسخة الثالثة، يمكنك حذف السطر التالي من نهاية الملف الرئيسي لمشروعك app.js: module.exports = app; وإضافة الكود التالي: app.set('port', process.env.PORT || 3000) app.listen(app.get('port'), () => { console.log(`Server running on: ${app.get('port')}`); }) ثم، يمكنك تعديل ملف التشغيل الموجود ضمن package.json ليصبح كالتالي: "scripts": { "start": "node app.js" }
- 3 اجابة
-
- 1
-
بالنسبة للنسخ Express 3 وما قبلها يمكنك استخدام: app.disable('x-powered-by'); أما في بعض النسخ من Express 4 يجب عليك استخدام التالي: app.set('x-powered-by', false) وكما في التعليق السابق يمكنك إجراء ذلك باستخدام وسيط لإزالة هذه الترويسة أو حتى تعديل محتواها: app.use(function (req, res, next) { res.removeHeader("X-Powered-By"); //أو res.setHeader( 'X-Powered-By', 'New Content Here' ); next(); });
- 4 اجابة
-
- 1
-
في النسخ السابقة يمكنك كما تمت الإشارة في التعليق السابق تعريف متغيّر express عام لأي خصائص إضافية: declare global { namespace Express { interface Request { context: Context } } } بحيث يصبح الكود الكامل عندما تريد استخدامه بالشكل التالي: import * as express from 'express'; export class Context { constructor(public newVariable) { } log(message: string) { console.log(this.newVariable, { message }); } } declare global { namespace Express { interface Request { context: Context } } } const app = express(); app.use((req, res, next) => { req.context = new Context(req.url); next(); }); app.use((req, res, next) => { req.context.log('returning from the context') res.send('Hi There!'); }); app.listen(5000, () => console.log('Server is listening on port: 5000')) أما في النسخ الحديثة من express 4.17.1 وما فوق أصبح يجب عليك استخدام وتضمين express-serve-static-core مع المودل بهذا الشكل: import {Express} from "express-serve-static-core"; declare module 'express-serve-static-core' { interface Request { newProperty?: string } interface Response { anotherProperty?: string }
- 3 اجابة
-
- 1
-
يمكنك بشكل افتراضي تعريف الاتصال على أنه http بدلاً من https ثم تنفيذ إعادة التوجيه إلى https عند زيارة أي مسار ضمن التطبيق فتصبح بالشكل التالي: var http = express(); http.get('*', function(req, res) { res.redirect('https://' + req.headers.host + req.url); }) http.listen(3000); أو يمكنك بدلاً من الحصول على اسم النطاق والمسار بشكل ديناميكي ضمن الكود، كتابته بشكل يدوي كالتالي: res.redirect('https://test.com' + req.url); وعندها قد ترغب بإضافة الحماية اللازمة لمنع سرقة ملفات تعريف الارتباط أثناء اتصال http مع الخادم، فيمكنك إضافة التالي إلى الكود لديك: const session = require('cookie-session'); app.use( session({ secret: "secretSession", httpOnly: true, secure: true }) ); وعندها سيتم منع المتصفح من الوصول إلى ملفات تعريف الارتباط، وسيتم إرسالها فقط عند اتصال من نوع https لأننا وضعنا قيمة secure: true كما يوجد طريقة أخرى مختصرة يمكنك تنفيذها من خلال استخدام الوسيط trust proxy بالشكل التالي: app.enable('trust proxy') app.use((req, res, next) => { req.secure ? next() : res.redirect('https://' + req.headers.host + req.url) }) فيتم اختبار في حال كان الاتصال آمن سيتم تخديم المسارات وإلا سيتم التحويل إلى https ببساطة.
- 2 اجابة
-
- 1
-
تتم إضافة المسار التالي في الأسفل بعد كتابة جميع المسارات الموجودة في مشروعك، وفي حال تمت زيارة مسار غير موجود يتم الدخول إلى هذا المسار ومعالجة الخطأ 404: app.get('*', function(req, res){ res.status(404).send('not found'); }); أما من ناحية إرسال الخطأ، فيوجد عدة طرق وهي كالتالي: app.use(function(req, res, next) { res.status(404); // الرد بإرسال صفحة HTML if (req.accepts('html')) { res.render('404', { url: req.url }); return; } // إرسال الرد بصيغة JSON if (req.accepts('json')) { res.json({ error: 'Not found' }); return; } // إرسال الرد بصيغة نصية res.type('txt').send('Not found'); }); أما في حال أردت إرسال الخطأ 404 بعد معالجة معيّنة ضمن تابع ما أو متحكّم خاص، يمكنك إرسال الخطأ مباشرةً ضمن التابع من خلال: res.status(404).send('not found') وعندها يمكنك استقبال هذا الخطأ من طرف المستخدم وتنفيذ إعادة التوجيه من طرف المستخدم بدلاً من الخادم.
- 3 اجابة
-
- 1
-
من أسهل الطرق هو استخدام child_process في node.js ثم يمكنك الوصول إلى مسار الكود في بايثون مع إمكانية تمرير المتغيرات بشكل مصفوفة بالشكل التالي: const spawn = require("child_process").spawn; const pythonCode = spawn('python',["..../pathhere/script.py", args1, args2, ...]); ثم يجب التأكد من تضمين أو (import sys) ضمن كود بايثون لديك وعندها ستتمكن من الوصول إلى قيم المتغيرات التي تم تمريرها من node.js بالشكل التالي: sys.argv[1] ....إلخ. أما لإرسال البيانات مجدداً من بايثون إلى node.js يمكنك إضافة التالي إلى الكود في بايثون: print(dataToSendBack) sys.stdout.flush() ثم يمكن لطرف node.js استقبال البيانات بالشكل التالي: pythonCode.stdout.on('data', (data) => { .... }); كما يمكنك استخدام الحزمة python-shell ويتم تحميلها بالشكل التالي: npm install python-shell ثم يتم استدعاء ملفات بايثون: const PythonShell = require('python-shell').PythonShell; PythonShell.run('script.py', null, function (err) { if (err) throw err; console.log('done'); }); ويتم تمرير المتغيرات من خلالها بهذا الشكل: var options = { mode: 'text', pythonPath: 'path/here/', pythonOptions: ['-u'], scriptPath: 'path/to/script', args: ['v1', 'v2', 'v3'] }; PythonShell.run('script.py', options, function (err, result) { if (err) throw err; console.log('test results: %j', result); }); كما يوجد بعض الحزم المشتركة مثل حزمة zerorpc التي يمكنك تضمينها في كل من كود الجافاسكريبت في node.js وكود بايثون واستخدامها في كلا الطرفين على منفذ واحد مما قد يسهّل آلية العمل خصوصاً في حال تبادل البيانات بشكل مكرر بين كل من الطرفين، بالشكل التالي: ضمن كود الجافاسكريبت: //في طرف node.js var zerorpc = require("zerorpc"); var client = new zerorpc.Client(); client.connect("tcp://127.0.0.1:3000"); client.invoke("hello world", "RPC", function(error, res, more) { console.log(res); }); ضمن بايثون: import zerorpc class HelloRPC(object): def hello(self, name): return "Hello there: , %s" % name t = zerorpc.Server(HelloRPC()) t.bind("tcp://0.0.0.0:3000") t.run()
- 2 اجابة
-
- 2
-
يوجد عدة طرق لإرسال الصفحات من خلال node.js ومنها استخدام محرك القوالب jade من خلال إنشاء الملف index.jade ضمن المجلّد الذي يحوي صفحات الموقع لديك pages وإضافة الكود التالي: include plain.html ثم وفي نفس المجلّد نجعل الصفحة plain.html تحوي كود HTML الخاص بهذه الصفحة بهذا الشكل: <!DOCTYPE html> ... وأخيراً في كود node.js من طرف الخادم نستطيع تمرير هذه الصفحة بالشكل التالي: res.render(index) ومع تحديث نسخة express.js بدءً من النسخة الثالثة، أصبح بإمكانك استخدام المحرّك ejs من خلال تحميل الحزمة التالية: npm install ejs --save وتمرير الصفحات بالشكل التالي: app.set('views', __dirname + '/pages'); app.engine('html', require('ejs').renderFile); أما في نسخة express 3.4 ومافوق يمكنك استخدام المحرّك ejs يالشكل التالي: app.set('view engine', 'ejs'); app.get('/home', function (req, res) { res.render('home.html'); });
- 3 اجابة
-
- 1
-
يوجد عدّة طرق لتمرير المتغيرات عبر مسارات التوجيه في node.js والأفضل بينها هو عن طريق query string أي في المسار مباشرةً من خلال إضافة العلامة ? إلى المسار ووضع اسم المتغيّر وقيمته. ولكن عندها يجب عليك التأكد من أن قيم هذه المتغيرات سيتم ترميزها وفك ترميزها بالشكل الصحيح ( encodeURIComponent ) لأنه لا يمكنك كتابة أي نص ترغب به وتقوم بإضافته بشكل مباشر إلى الرابط. فيصبح الكود بالشكل التالي: app.port('/test', function(req, res) { var string = encodeURIComponent('نضع هنا القيم المراد تمريرها'); res.redirect('/?check=' + string); }); وبعد ذلك، يمكنك الحصول على قيم هذه المتغيرات من خلال التابع req.query بالشكل التالي: app.get('/', function(req, res) { var testValues = req.query.check; ..... }); كما يمكنك استخدام الحزمة url الموجودة في node.js لسهولة إنشاء query string في حال كان لديك أكثر من قيمة يجب أن تقوم بتمريرها من خلال التابع url.format بالشكل التالي: const url = require('url'); app.post('/test', function(req, res) { res.redirect(url.format({ pathname:"/", query: { "variable1": 1, "variable2": 2, "check":"test value" } })); }); وفي حال كنت تستخدم نسخة من node.js أعلى من النسخة السابعة، يمكنك استخدام الحزمة queryString بهذا الشكل: const querystring = require('querystring'); app.post('/test', function(req, res) { const query = querystring.stringify({ "variable1": 1, "variable2": 2, "check":"test value" }); res.redirect('/?' + query); }); كما يوجد طرق أخرى لتحقيق ذلك من خلال استخدام الجلسات sessions أو req.flash ولكن في النسخ الحديثة من إطار عمل express من الممكن أن تحتاج استخدام حزم أخرى إضافية لتحقيق ذلك من خلالها.
- 1 جواب
-
- 1
-
يمكنك تجربة الرابط التالي: http://localhost:5000/main.css أما في حال أردت وجود /styles في الرابط، فيجب أن تقوم بتعديل الكود لديك ليصبح بالشكل التالي: app.use("/styles", express.static(__dirname + '/styles')); فمع عدم ذكر أي مسار في كود app.use ستتم الاستجابة إلى المسار الرئيسي لمجلّد مشروعك دون أي إضافات.
- 2 اجابة
-
- 1
-
لقد تم تعديل الحزمة node-sass إلى node-sass-middleware وأصبح من الممكن استخدامها مباشرةً بالكود لديك كالتالي: var fs = require('fs'), path = require('path'), express = require('express'), sassMiddleware = require('node-sass-middleware') var app = module.exports = express(); app.use( sassMiddleware({ src: __dirname + '/sass', dest: __dirname + '/src/css', debug: true, }) ); app.use(express.static(path.join(__dirname, 'public'))); بحيث تضع المسارات حسب وجود ملفات النسيقات في مشروعك بدلاً من sass و src/css. مع الانتباه لضرورة تضمين الوسيط قبل إضافة كود express.static حتى يتم التحديث على الملفات قبل إعادتها إلى المتصفح.
- 1 جواب
-
- 1
-
بالإطلاع على محتوى الرد نجد الخاصية Transfer-Encoding: chunked، وهنا لا يمكن تضمين content-length لأن البيانات يتم تقسيمها إلى جزء أو عدة أجزاء (ما يدعى ب chunks) ضمن محتوى الرد (response body) مع وجود علامات ضمن كل جزء تدل على حجم بيانات هذا الجزء فقط. وإن node.js بشكل افتراضي يقوم بإضافة Transfer-Encoding: chunked ضمن ترويسة الطلب، ولكن عند إضافة Content-Length يتم تعطيلها. أما وجود الخاصية Content-Encoding:gzip ضمن الترويسة فتدل على أنه تم تفعيل الوسيط connect.compress والذي يقوم أيضاً بإيقاف Content-Length. ولكن بجميع الأحوال السابقة في حال لم تقم بإنشاء محتوى مضغوط بنفسك بشكل يدوي، فإن الترويسة Content-Length التي قمت بإنشائها بشكل يدوي ستكون غير ملائمة للمحتوى الأخير الذي يتم إرسالة من طرف الخادم وبالتالي يجب عليك الاعتماد على الوسيط connect بدلاً من إجرائها بشكل يدوي لتجنب بعض المشاكل. وفي النهاية يجب الأخذ بعين الاعتبار أن البيانات التي يتم إرسالها من الخادم إلى المستخدم النهائي من الممكن أن تخضع للعديد من الإضافات أو التعديلات بحسب الوسطاء التي يتم استخدامها والتي تقوم بدورها بالتعديل مرات عديدة على ترويسة الطلب.
- 1 جواب
-
- 1
-
يقوم إطار العمل 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 });
- 1 جواب
-
- 1
-
يمكنك تنفيذ ذلك بعدّة طرق، ولكن بما أن عدد العناوين كبير من الأفضل لك أن تستعين بأي لغة برمجة قادرة على التخاطب مع مخدّم البريد الالكتروني والقيام بإرسال الرسائل (ومنها Node.js و PHP). ومن خلالها تستطيع إجراء حلقة تكرارية للمرور على كافة سجلات عنواين البريد الالكتروني وإرسال الرسالة لكل بريد على حدى. طبعاً يجب أولاً تهيئة البيانات بالشكل المناسب في حال كانت غير مرتبة وإدخالها إلى أي نوع من قواعد البيانات (MongoDB، MySQL) أو حتى يمكنك بدلاً من استخدام قاعدة بيانات تحويل هذه البيانات لتصبح على شكل JSON وبالتالي يسهل التعامل معها من قبل لغة البرمجة التي تفضّلها. لذلك يجب عليك تحديد التالي في حال أردت تنفيذ هذه العملية برمجياً: تحديد لغة البرمجة التي ستقوم بالمهمة. تحديد ماهو المزود أو خادم البريد الالكتروني الذي ستقوم من خلاله بإرسال الرسائل (للحصول على البروتوكول والمعلومات التي ستقوم بإضافتها لاحقاً). تهيئة وتحضير البيانات بالشكل المناسب لسهولة التعامل معها لاحقاً من قبل لغة البرمجة التي اخترتها. وبمجرّد اختيارك للغة البرمجة والخادم، يمكنك من خلال إجراء بحث بسيط على الانترنت الاطلاع على أمثلة عملية عديدة عن كيفية تحضير وإرسال الرسائل بمختلف اللغات والتقنيات الموجودة.
-
يوجد حل سريع لمشكلة Bottom Overflowed في Flutter وهو بوضع هذا ال widget بداخل scaffold وتطبيق resizeToAvoidBottomInset: false return Scaffold( resizeToAvoidBottomInset : false, body: YourWidgets(), ); أو من خلال استخدام SingleChildScrollView عن طريق جعل هذا الwidget كابن مباشر لها: SingleChildScrollView( physics: ClampingScrollPhysics(), child: Container(), ) وعندها في حال تغيّر القياس المسموح أو فتح لوحة الكتابة لن يؤثر ذلك على القياس الأصلي له وسيتجاوب مع هذه التغييرات.
- 1 جواب
-
- 1
-
المفهوم من كلمة تفريغ هنا هو إما وضع قيمة فارغة '' أو القيمة 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 يمكنك إما تغييرها في قاعدة البيانات أو استبدالها بالقيمة الفارغة ''
- 1 جواب
-
- 1
-
إن التابع 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 فيمكنك تطبيق ذلك من خلال كل منهما بنفس النتيجة.
- 1 جواب
-
- 1
-
إن دورة تطوير التطبيقات باستخدام لغة javascript هي دورة شاملة فمن خلال التقنيات التي ستتعلمها خلال الدورة ستتمكن من تطوير التطبيق بالإضافة للوحة التحكم dashoard من خلال node.js وأطر العمل التي ستتعلمها. كما ستجد العديد من المشاريع العملية التي يمكنك تنفيذها بنفسك مع الدورة. وللمزيد من المعلومات حول هذه الدورة ومحتواها يمكنك الاطلاع من هنا أو في حال لديك استفسار آخر يمكنك التواصل مع فريق الدعم من هنا.
- 5 اجابة
-
- 1
-
يعتمد ذلك على المكتبة التي يتم استخدامها في التعامل مع ملفات اكسل، ولكن لا أعتقد أنه من الممكن إرسال ملفات متفرقة منفصلة من خلال طلب واحد فقط. من خلال استخدام مكتبة Laravel-Excel على سبيل المثال، يمكنك تخزين الملفات أولاً من خلال store()، ثم إرسالها بشكل مضغوط zip بالطلب: if (file_exists($fileurl)) { return Response::download($fileurl, 'files.zip', array('Content-Type: application/octet-stream','Content-Length: '. filesize($fileurl)))->deleteFileAfterSend(true); } else { return ['status'=>'zip file does not exist']; }
-
بدءً من الإصدار الثالث في 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;
- 1 جواب
-
- 1
-
إن تعطيل 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 ];