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

Salah Eddin Beriani2

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

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

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

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

  1. إجابة Salah Eddin Beriani2 سؤال في سؤال عن حماية api كانت الإجابة المقبولة   
    نغم يمكنك حفظها في قاعدة البيانات هذا بديهي ولكن أيضا يمكنك تضمين المعلومات في ال token المرسل بمعنى عند فك تشفير ال token في backend ستحصل على معلومات ال user بما فيها النوع و يمكنك التصرف على ذلك الأساس 
  2. إجابة Salah Eddin Beriani2 سؤال في next.js إعداد ESLint لـ NextJs كانت الإجابة المقبولة   
    منذ الإصدار 11.0.0 ، يوفر Next.js تجربة ESLint متكاملة خارج الصندوق. أضف next lint على هيئة نص برمجي إلى package.json:
    "scripts": { "lint": "next lint" } إذا لم يكن لديك بالفعل ESLint تم تكوينه في التطبيق الخاص بك ، فسيتم إرشادك خلال عملية التثبيت والتكوين.
    yarn lint # You'll see a prompt like this: # # ? How would you like to configure ESLint? # # ❯ Base configuration + Core Web Vitals rule-set (recommended) # Base configuration # None سيقوم Next.js تلقائيًا بتثبيت eslint و eslint-config-next كاعتمادات تطوير في تطبيقك وإنشاء ملف .eslintrc.json في جذر مشروعك الذي يتضمن التكوين الذي اخترته.
  3. إجابة Salah Eddin Beriani2 سؤال في كيف اجعل الكمبوننت reusable عن طريق جعل ال onPress عبارة عن param لكى يتم تمريره وعمل وظائف اخرى فى اماكم متفرقة كانت الإجابة المقبولة   
    حبذا لو استخدمت دالة خارجية ثم قمت بعملك هناك وتمرير ما تريد
    const MainCard = ({ image, title, price, onPress, onFavPress }) => { const [isFav, setIsFav] = useState(false); const onPress1 = (params) => {//يمكنك تمرير ما تريد هنا setIsFav(!isFav); //يمكنك التعامل هنا } return ( <TouchableOpacity onPress={onPress} style={styles.container}> <TouchableOpacity // onPress={() => setIsFav(!isFav)} onPress={onPress1} style={styles.iconContainer} > {isFav ? ( <Icon name="favorite-border" size={phoneWidth * 0.05} /> ) : ( <Icon name="favorite" size={phoneWidth * 0.05} color="red" /> )} </TouchableOpacity> <Image style={styles.imageBackground} source={image} resizeMode="cover" /> <Text numberOfLines={2} style={styles.title}> {title} </Text> <Text style={styles.price}>{price} SAR</Text> </TouchableOpacity> ); };  
  4. إجابة Salah Eddin Beriani2 سؤال في عندى مشكلة بالريدكس , الكود يعمل بشكل صحيح لكن هناك مشكلة بسيطة وهى عندما اضيف الى array فانه يضيف بعض البيانات فارغة داخل ال array كانت الإجابة المقبولة   
    لا أدري بالضبط عن أي إضافة أنت تتحدث لكن من مضمون الشيفرة فهمت انك تبحث عن Item لتضيفها الى سلة المفضلة وذلك عبر تغيير القيمة المنطقية 
    if (itemFav === true) return { ...state, myAllAds: state.myAllAds.map((content, i) => i === action.payload.id - 1 ? { ...content, isFav: false } : content ), }; if (itemFav === false) return { ...state, myAllAds: state.myAllAds.map((content, i) => i === action.payload.id - 1 ? { ...content, isFav: true } : content ), }; قمت بتعديل الشيفرة لتتماشى مع ما فهمت انك تريد تحقيقه 
  5. إجابة Salah Eddin Beriani2 سؤال في كيفية عمل fastify-nextjs ؟ كانت الإجابة المقبولة   
    نظرًا لأن Next.js يحتاج إلى بعض الوقت ليكون جاهزًا عند التشغيل الأول ، يجب أن تعلن عن مساراتك داخل callback ، بعد تسجيل المكون الإضافي. سيعرض المكون الإضافي واجهة برمجة التطبيقات التالية في Fastify والتي ستتعامل مع العرض نيابة عنك.
    const fastify = require('fastify')() fastify .register(require('fastify-nextjs')) .after(() => { fastify.next('/hello') }) fastify.listen(3000, err => { if (err) throw err console.log('Server listening on http://localhost:3000') }) إذا كنت بحاجة إلى التعامل مع جزء العرض بنفسك ، فما عليك سوى تمرير callback إلى next
    fastify.next('/hello', (app, req, reply) => { // your code // `app` is the Next instance app.render(req.raw, reply.raw, '/hello', req.query, {}) }) إذا كان لديك معالجة مسبقة مخصصة لطلبات _next / * ، فيمكنك منع هذا المعالجة باستخدام noServeAssets: الخاصية true لخيارات المكون الإضافي
    fastify .register(require('fastify-nextjs'), { noServeAssets: true }) .after(() => { fastify.next(`${process.env.BASE_PATH || ''}/_next/*`, (app, req, reply) => { // your code app.getRequestHandler()(req.raw, reply.raw).then(() => { reply.sent = true }) }) })  
  6. إجابة Salah Eddin Beriani2 سؤال في ظهور الخطأ failed to serialize user into session في node.js كانت الإجابة المقبولة   
    لقد نسيت الشيفرة التي تعمل في المنتصف عند المصادقة 
    passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); يستخدم Passport وظيفة serializeUser للاحتفاظ ببيانات المستخدم (بعد المصادقة الناجحة) في session. يتم استخدام وظيفة deserializeUser لاسترداد بيانات المستخدم من session.
    تتحقق كلتا الدالتين serializeUser و deserializeUser من الوسيطة الأولى التي تم تمريرها إليهما ، وإذا كانت من نوع دالة ، فإن serializeUser و deserializeUser لن تفعلا أي شئ  ولكن يتم وضع الدالة في كومة من الوظائف  والتي سيتم استدعاؤها بعد ذلك .
    عندما يتم تمرير الوسيطات الأولى ليست من النوع وظيفة يحتاج Passport إلى الإعداد التالي لحفظ بيانات المستخدم بعد المصادقة في session:
    app.use(express.session({ secret: 'secretKeyHere' })); app.use(passport.initialize()); app.use(passport.session()); لذا فكل الشيفرات مترابطة مع بعضها غياب احدها سيؤدي لفشل كامل
  7. إجابة Salah Eddin Beriani2 سؤال في تفعيل https بدلاً من http على خادم node.js كانت الإجابة المقبولة   
    اذا كانت لديك شهادة ssl يمكنك استخدام express بدون تعديلات
    const express = require('express') const app = express() const port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`)) ستكون الاعدادات الاولية الخاصة ب nginx كالتالي
    server { listen 80; server_name localhost; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } كما ترى  سيستمع خادم الويب إلى http: // localhost port 80. يخبر الموقع / الكتلة NGINX ما يجب فعله مع أي طلب وارد نستخدم proxy_pass للإشارة إلى تطبيق Node.js الخاص بنا  والذي يعمل على http: // localhost: 3000 في حالتنا.
    في هذه المرحلة  يجب عليك حفظ الملف وكتابة ما يلي لإعادة تشغيل NGINX 
    sudo service nginx restart الأن يمكنك اظافة تعديلات ل nginx لتفعيل ssl 
    server { listen 80; listen 443 ssl; //https port server_name localhost; ssl_certificate /etc/nginx/ssl/server.crt;//الشهادة ssl_certificate_key /etc/nginx/ssl/server.key; // مفتاح الشهادة location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } يمكنك الأن حفظ الملف واعادة تشغيل nginx مجددا 
    الآن  إذا قمت بالوصول إلى https: // localhost ، فسيكون اتصالك آمنًا. يفترض التكوين أعلاه أن الشهادة والمفتاح الخاص موجودان في /etc/nginx/ssl/server.crt و /etc/nginx/ssl/server.key على التوالي ، ولكن يمكنك تغيير هذه المواقع إذا كنت ترغب في ذلك.
  8. إجابة Salah Eddin Beriani2 سؤال في Heroku خطأ h13 timeout responce كانت الإجابة المقبولة   
    بالنظر للشيفرة والخطأ لا يمكن تحديد الخطأ بالشكل الدقيق لكن يمكن أن أشير لتعديلات ممكن أن تكون السبب 
    يجب أن يكون هناك env variable PORT  في heroku المجلد public/upload لا يوجد في المشروع تأكد من أسماء المتغيرات env  تأكد جيدا من رابط ال database في ال router أنت تستخدم async await بدون try catch try{ infractionList = await infractionModel.find().populate("Catg"); res.send(infractionList) }carch(err){ res.status(400).json(err) }  
  9. إجابة Salah Eddin Beriani2 سؤال في كيف يمكن برمجة وظيفتين مختلفتين ل 2 من الازرار في form واحدة jQuery كانت الإجابة المقبولة   
    بافتراض أن لديك form بهذا الشكل 
    <form id="my-form"> <input type="email" name="email" placeholder="(Your email)" /> <button type="submit" value="button-one">Go - One</button> <button type="submit" value="button-two">Go - Two</button> <button type="submit" value="button-three">Go - Three</button> </form> لعمل لكل زر وظيفة يجب أن نقوم بلصق حدث نقر على كل الأزرار والتعامل مع الحدث قبل ال submit وذلك ببساطة يمكن تحقيقه بهذا الشكل 
    $("#my-form button").click(function(ev){ ev.preventDefault()// الغاء ال فورم if($(this).attr("value")=="button-one"){ //يمنكك عمل وظيفة لكل زر بالتحقق منه } // $("#my-form").submit(); وهنا اذا أردت تشغيل الفورم });  
  10. إجابة Salah Eddin Beriani2 سؤال في إنشاء حقل فريد آخر بدلاً من id_ في mongodb كانت الإجابة المقبولة   
    في الحقيقة يوجد مثال في التوثيق الرسمي ل mongodb عن كيفية تحقيق المطلوب و هو عن طريق انشاء counter collection
    db.counters.insert( { _id: "userid", seq: 0 } ) قم بإنشاء دالة getNextSequence تقبل اسم التسلسل. تستخدم الدالة طريقة findAndModify لزيادة قيمة seq  وإرجاع هذه القيمة الجديدة:
    function getNextSequence(name) { var ret = db.counters.findAndModify( { query: { _id: name }, update: { $inc: { seq: 1 } }, new: true } ); return ret.seq; } ثم استخدم الوظيفة getNextSequence  أثناء الإدراج
    db.users.insert( { _id: getNextSequence("userid"), name: "salah" } ) db.users.insert( { _id: getNextSequence("userid"), name: "ahmed" } ) db.users.find() { _id : 1, name : "salah" } { _id : 2, name : "ahmed" }  
  11. إجابة Salah Eddin Beriani2 سؤال في ما الفرق بين module.exports و export default في node.js كانت الإجابة المقبولة   
    هذا لأن node لا يدعم es6 syntax بعد ولكن اذا كنت تريد ذلك يمكنك أن تثبت مكتبة esm فهي تفعل لك استخدام es6 في node
    npm install esm بعدها عدل start script في ملف package.json
    { "name": "My-app", "version": "1.0.0", "description": "Some Hack", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node -r esm index.js" }, }  
  12. إجابة Salah Eddin Beriani2 سؤال في الحصول على معلومات من ملف package.json وتحديث المكتبات ضمن node.js كانت الإجابة المقبولة   
    تحديث المكتبات برمجيا فأنت تحتاج ل npm نفسه مستورد لديك
    const npm = require('npm'); npm.load({'save': true}, function () { npm.commands.outdated(function (err, rawOutdated) { const outdated = rawOutdated.map(function (module) { return module[1]; }); npm.commands.install(outdated, function(err, d) { }); }); }); يمكنك استبدال save ب save-dev اذا أردت ذلك 
  13. إجابة Salah Eddin Beriani2 سؤال في التحكم بإعادة تشغيل وإيقاف الخادم بشكل برمجي في node.js كانت الإجابة المقبولة   
    توفر الوحدة الأساسية للعملية طريقة سهلة تتيح لك الخروج برمجيًا من برنامج Node.js وهي process.exit.
    عندما يقوم Node.js بتشغيل هذا الأمر ، يتم إجبار العملية على الإنهاء على الفور.
    هذا يعني أن أي رد اتصال معلق ، أو أي طلب شبكة لا يزال قيد الإرسال ، أو أي وصول إلى نظام الملفات ، أو عمليات الكتابة إلى stdout أو stderr - سيتم إنهاء كل ذلك بشكل غير لائق على الفور.
    إذا كان هذا مناسبًا لك ، فيمكنك تمرير عدد صحيح يشير إلى نظام التشغيل لكود الخروج:
    process.exit(1) رمز الخروج افتراضيًا هو 0 ، مما يعني النجاح. رموز الخروج المختلفة لها معنى مختلف ، والذي قد ترغب في استخدامه في نظامك الخاص لجعل البرنامج يتواصل مع البرامج الأخرى.
    في كثير من الأحيان مع Node نبدأ الخوادم ، مثل خادم HTTP هذا:
    const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) في هذه الحالة ، تحتاج إلى إرسال إشارة SIGTERM للأمر ، والتعامل مع ذلك باستخدام معالج إشارة العملية:
    const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) const server = app.listen(3000, () => console.log('Server ready')) process.on('SIGTERM', () => { server.close(() => { console.log('Process terminated') }) }) SIGKILL هي الإشارات التي تخبر العملية بالإنهاء فورًا ، وتتصرف بشكل مماثل مثل process.exit ().
    يمكنك إرسال هذه الإشارة من داخل البرنامج ، في وظيفة أخرى:
    process.kill(process.pid, 'SIGTERM')  
  14. إجابة Salah Eddin Beriani2 سؤال في ظهور الخطأ Client does not support authentication protocol requested في node.js كانت الإجابة المقبولة   
    يمكنك تنفيذ الاوامر التالية لحل المشكلة
    $ mysql -u root -p Enter password: (enter your root password) mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password'; mysql> FLUSH PRIVILEGES; mysql> quit كما يمكنك أيضا انشاء مستخدم جديد واستخدامه للاتصال 
    CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';  
  15. إجابة Salah Eddin Beriani2 سؤال في كيف يمكنني طباعة الأغراض objects في الكونسول من node.js؟ كانت الإجابة المقبولة   
    تحتاج تعمل stringfy لل object 
    console.log(JSON.stringify(obj)) أو يمكنك استخدام console.dir مباشرة على ال object
    console.dir(object) ويوجد أيضا console.table
    console.table(object)  
  16. إجابة Salah Eddin Beriani2 سؤال في ما الفرق بين fs.write, fs.writeFile, fs.createWriteStream في node.js كانت الإجابة المقبولة   
    تتضمن الوحدة النمطية fs طريقة writeFile عالية المستوى يمكنها كتابة البيانات إلى الملفات بشكل غير متزامن. هذا يعني ، كما هو الحال مع الكثير من العمليات في Node.js ، أن الإدخال / الإخراج لا يحظر ، ويصدر حدثًا عند انتهاء العملية.
    فيما يلي مثال بسيط على رمز كتابة بعض كلمات الأغاني في ملف:
    // writefile.js const fs = require('fs'); let text = 'text textetxtettettt'; fs.writeFile('text.txt', text, (err) => { if (err) throw err; console.log('text saved!'); }); على عكس أساليب fs.writeFile و fs.writeFileSync عالية المستوى ، يمكنك الاستفادة من المزيد من التحكم عند الكتابة إلى الملفات في Node.js باستخدام طريقة fs.write ذات المستوى المنخفض. تسمح طريقة fs.write بالتحكم الدقيق في الموضع في الملف لبدء الكتابة فيه ، ومخزن مؤقت يمكنك تحديده للكتابة ، بالإضافة إلى أي جزء من المخزن المؤقت تريد كتابته على الملف.
    // fs_write.js const fs = require('fs'); let path = 'text.txt'; let buffer = new Buffer('qdqdqsdqdqsdqsdqdqsdqdqsdqdqd'); fs.open(path, 'w', function(err, fd) { if (err) { throw 'could not open file: ' + err; } fs.write(fd, buffer, 0, buffer.length, null, function(err) { if (err) throw 'error writing file: ' + err; fs.close(fd, function() { console.log('wrote the file successfully'); }); }); }); عند التعامل مع الملفات الكبيرة بشكل خاص ، أو الملفات التي تأتي في أجزاء ، على سبيل المثال من اتصال الشبكة ، فإن استخدام streams هو الأفضل لكتابة الملفات دفعة واحدة 
    // write_stream.js const fs = require('fs'); let writeStream = fs.createWriteStream('secret.txt'); writeStream.write('aef35ghhjdk74hja83ksnfjk888sfsf', 'base64'); writeStream.on('finish', () => { console.log('wrote all data to file'); }); writeStream.end();  
  17. إجابة Salah Eddin Beriani2 سؤال في ما الفرق بين save و insert في mongodb؟ كانت الإجابة المقبولة   
    دعنا ننظر في الحالتين هنا ل save و indert
    1) وجود _id في المستند.
    2) عدم وجود _id في المستند.
    عندما لا يتواجد id في المستند المحفوظ كلاهما يعمل نفس العمل.
    عند تواجد id هنا يكمن الاختلاف insert هنا ستتحقق من وجود مستند في collection بنفس id اذا تواجد سترجع لك خطأ لتخبرك بذلك
    E11000 duplicate key error index: أما save فستعمل اتبدال لكامل المستند وتحفضه بنفس ال id المدرجة للحفظ عدا هذا فلا اختلاف كبير بينهما 
  18. إجابة Salah Eddin Beriani2 سؤال في expo av خطأ undefined is not an object (evaluating loadAsync) كانت الإجابة المقبولة   
    الخطأ يحدث عند قراءة الملف الصوتي في شيفرتك لم أجد أي تعريف ل player والخطأ يقول undefined ليس كاءن يعني ببساطة انت نسيت تعريف player
    const player = new Audio.Sound();  
  19. إجابة Salah Eddin Beriani2 سؤال في كيف اصل الى ثابت داخل الفانكشن const حتى استطيع استخدامه خارج الفانكشن ؟ كانت الإجابة المقبولة   
    const getToken = async () => { try { const userToken = await AsyncStorage.getItem('userToken'); if (userToken !== null) { setToken(userToken); console.log('the token is ' + token); return userToken; //قم بارجاعه هنا } } catch (e) { console.log('the token is nulllllllllll'); console.log(e.message); } }; ثم في اي مكان يمكنك
    const token = getToken();  
  20. إجابة Salah Eddin Beriani2 سؤال في كيف أخزن ال token القادم من api في const باستخدام react native كانت الإجابة المقبولة   
    import { AsyncStorage } from 'react-native'; const [Data, setData] = useState([]); const loginStudent = () => { axios .post('https://carna-test-app234/api/v2/login', { type: 3, method_type: 'email', email: 'student@app321.com', password: '123456', }) .then(async res => { console.log(res.data); const token = res.data.access_token//هذا لتخزين في متغير await AsyncStorage.setItem( 'token', token ); setData(res.data); }) .catch(err => console.log(err)); }; يمكنك استخدام AsyncStorage من react-native
  21. إجابة Salah Eddin Beriani2 سؤال في هل من الممكن رفع ملع في ميثود PUT في POSTMAN كانت الإجابة المقبولة   
    أثناء استخدام Postman خاصةً عند اختبار تحميل الملف يرجى التأكد من :
    في Header ال Content-type يجب ان يكون multipart/form-data
    في Body حدد form-data و تأكد من اختيار file مكان text 
    وال method لاباس تكون put

     
  22. إجابة Salah Eddin Beriani2 سؤال في أين أقوم بعمل ال unit test فى node js ؟؟ كانت الإجابة المقبولة   
    نعم ال unit test بامكان اجراءه على ال model سأفترض model صغير لتبسط المثال 
    const UserSchema = new mongoose.Schema({ username: { type: String }, email: { type: String } }) يمكنك اجراء unite test للتحقق مثلا من ان username و email متواجدين فعلا في model
    const User = require('/user.model.js') ... describe("User Model", () => { it("has username and email attributes", () => { let expectedKeys = ["username", "email"]//المفاتيح المتوقع تواجدها let keys = Object.keys(User.schema.paths)//جلب المفاتيح الخاصة بالموديل let userAttributes = [keys[0], keys[1]]//هيكلتها بطريقة تساوي المفاتيخ المتوقغة expect(userAttributes).toStrictEqual(expectedKeys)//المساواة }) }) بالنسبة للجزء الثاني من السؤال فهذا يعتمد عليك وعلى المعايير التي تريد تجريبها بعد ذلك يمكنك كتابة شيفرة الفحص وتوفير المعاملات اللازمة.
  23. إجابة Salah Eddin Beriani2 سؤال في ما الخطأ فى هذا ال inegration test ؟ كانت الإجابة المقبولة   
    معذرة اخطات في وضع  async في المكان الخطا
    describe("Post /courses", async() => { describe("given a right inputs", () => { test("should res to be 200 status code", async() => { const res = await request(app).post("/courses").send({ name: "first course", description: "description should be more than 25. description should be more than 25. description should be more than 25. description should be more than 25. ", price: 100, }); expect(res?.statusCode).toBe(200); }); }); });  
  24. إجابة Salah Eddin Beriani2 سؤال في الضغط على زر من خلال jest في مشروع React كانت الإجابة المقبولة   
    بافتراض مكون بسيط
    import React from 'react'; export default function test() { return ( <div> <button id="btn">click</button> </div> ); } يمكنك استخدام jest الى جانب enzyme للضغط على الزر
    import React from 'react'; import { shallow } from 'enzyme'; import Test from './Test'; it('click btn', () => { const wrapper = shallow(<Test />);//استخدام المكون const button = wrapper.find('#btn');//تحديد الزر button.simulate('click');//محاكات الضغط });  
  25. إجابة Salah Eddin Beriani2 سؤال في كيفية تنفيذ دالة عند تغير الـ route في React؟ كانت الإجابة المقبولة   
    نعم يوجد history.listen وهي تساعدك لتعرف أن route قد تغير 
    import React, { useEffect } from 'react'; import { useHistory } from 'react-router-dom'; const App = () => { const history = useHistory(); useEffect(() => { return history.listen((location) => { console.log(`You changed the page to: ${location.pathname}`); }); }, [history]); return <div>...</div>; }; طبعا يجب أن يكون المكون الذي يحتوي هذه الشيفرة في أعلى هرم المكونات 
×
×
  • أضف...