-
المساهمات
847 -
تاريخ الانضمام
-
تاريخ آخر زيارة
إجابات الأسئلة
-
إجابة Salah Eddin Beriani2 سؤال في سؤال عن حماية api كانت الإجابة المقبولة
نغم يمكنك حفظها في قاعدة البيانات هذا بديهي ولكن أيضا يمكنك تضمين المعلومات في ال token المرسل بمعنى عند فك تشفير ال token في backend ستحصل على معلومات ال user بما فيها النوع و يمكنك التصرف على ذلك الأساس
-
إجابة 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 في جذر مشروعك الذي يتضمن التكوين الذي اخترته.
-
إجابة 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> ); };
-
إجابة 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 ), }; قمت بتعديل الشيفرة لتتماشى مع ما فهمت انك تريد تحقيقه
-
إجابة 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 }) }) })
-
إجابة 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()); لذا فكل الشيفرات مترابطة مع بعضها غياب احدها سيؤدي لفشل كامل
-
إجابة 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 على التوالي ، ولكن يمكنك تغيير هذه المواقع إذا كنت ترغب في ذلك.
-
إجابة 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) }
-
إجابة 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(); وهنا اذا أردت تشغيل الفورم });
-
إجابة 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" }
-
إجابة 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" }, }
-
إجابة 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 اذا أردت ذلك
-
إجابة 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')
-
إجابة 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';
-
إجابة Salah Eddin Beriani2 سؤال في كيف يمكنني طباعة الأغراض objects في الكونسول من node.js؟ كانت الإجابة المقبولة
تحتاج تعمل stringfy لل object
console.log(JSON.stringify(obj)) أو يمكنك استخدام console.dir مباشرة على ال object
console.dir(object) ويوجد أيضا console.table
console.table(object)
-
إجابة 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();
-
إجابة Salah Eddin Beriani2 سؤال في ما الفرق بين save و insert في mongodb؟ كانت الإجابة المقبولة
دعنا ننظر في الحالتين هنا ل save و indert
1) وجود _id في المستند.
2) عدم وجود _id في المستند.
عندما لا يتواجد id في المستند المحفوظ كلاهما يعمل نفس العمل.
عند تواجد id هنا يكمن الاختلاف insert هنا ستتحقق من وجود مستند في collection بنفس id اذا تواجد سترجع لك خطأ لتخبرك بذلك
E11000 duplicate key error index: أما save فستعمل اتبدال لكامل المستند وتحفضه بنفس ال id المدرجة للحفظ عدا هذا فلا اختلاف كبير بينهما
-
إجابة Salah Eddin Beriani2 سؤال في expo av خطأ undefined is not an object (evaluating loadAsync) كانت الإجابة المقبولة
الخطأ يحدث عند قراءة الملف الصوتي في شيفرتك لم أجد أي تعريف ل player والخطأ يقول undefined ليس كاءن يعني ببساطة انت نسيت تعريف player
const player = new Audio.Sound();
-
إجابة 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();
-
إجابة 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
-
إجابة Salah Eddin Beriani2 سؤال في هل من الممكن رفع ملع في ميثود PUT في POSTMAN كانت الإجابة المقبولة
أثناء استخدام Postman خاصةً عند اختبار تحميل الملف يرجى التأكد من :
في Header ال Content-type يجب ان يكون multipart/form-data
في Body حدد form-data و تأكد من اختيار file مكان text
وال method لاباس تكون put
-
إجابة 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)//المساواة }) }) بالنسبة للجزء الثاني من السؤال فهذا يعتمد عليك وعلى المعايير التي تريد تجريبها بعد ذلك يمكنك كتابة شيفرة الفحص وتوفير المعاملات اللازمة.
-
إجابة 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); }); }); });
-
إجابة 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');//محاكات الضغط });
-
إجابة 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>; }; طبعا يجب أن يكون المكون الذي يحتوي هذه الشيفرة في أعلى هرم المكونات