fix: add Api challenges - arabic translation
This commit is contained in:
@ -0,0 +1,52 @@
|
||||
---
|
||||
id: 5a8b073d06fa14fcfde687aa
|
||||
title: Exercise Tracker
|
||||
localeTitle: متتبع التمرين
|
||||
challengeType: 4
|
||||
isRequired: true
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
إنشاء تطبيق جافا سكريبت كامل للمكدس يشبه وظيفيًا ما يلي: <a href='https://fuschia-custard.glitch.me/' target='_blank'>https://fuschia-custard.glitch.me/</a> .
|
||||
سيشركك العمل في هذا المشروع في كتابة شفرتك على Glitch في مشروعنا المبدئي. بعد الانتهاء من هذا المشروع ، يمكنك نسخ عنوان URL الافتراضي الخاص بك (إلى الصفحة الرئيسية لتطبيقك) في هذه الشاشة لاختباره! اختياريًا ، يمكنك اختيار كتابة مشروعك على نظام أساسي آخر ، ولكن يجب أن يكون مرئيًا بشكل عام لاختبارنا.
|
||||
ابدأ هذا المشروع على خلل باستخدام <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-exercisetracker/' target='_blank'>هذا الرابط</a> أو استنساخ <a href='https://github.com/freeCodeCamp/boilerplate-project-exercisetracker/'>هذا المستودع</a> على GitHub! إذا كنت تستخدم خلل ، تذكر لحفظ الرابط لمشروعك في مكان آمن!
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يمكنني إنشاء مستخدم عن طريق نشر اسم مستخدم بيانات النموذج إلى / api / exercise / new-user وسيتم إرجاع كائن باسم المستخدم و <code>_id</code> .
|
||||
testString: ''
|
||||
- text: يمكنني الحصول على مجموعة من جميع المستخدمين عن طريق الحصول على api / exercise / users مع نفس المعلومات عند إنشاء مستخدم.
|
||||
testString: ''
|
||||
- text: "يمكنني إضافة تمرين إلى أي مستخدم عن طريق نشر بيانات userId (_id) ، والوصف ، والمدة ، والتاريخ الاختياري إلى / api / exercise / add. إذا لم يتم تقديم تاريخ ، فسيستخدم التاريخ الحالي. سيعرض التطبيق كائن المستخدم مع إضافة حقول التمرين ".
|
||||
testString: ''
|
||||
- text: يمكنني استرداد سجل تمرين كامل لأي مستخدم من خلال الحصول على / api / exercise / log بمعلمة userId (_id). سيقوم التطبيق بإرجاع كائن المستخدم مع سجل صفيف المضافة وعدد (العدد الكلي للتمرين).
|
||||
testString: ''
|
||||
- text: "يمكنني استرداد جزء من سجل أي مستخدم عن طريق تمرير المعلمات الاختيارية من وإلى أو الحد. (تنسيق التاريخ yyyy-mm-dd ، limit = int) "
|
||||
testString: ''
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: bd7158d8c443edefaeb5bd0f
|
||||
title: File Metadata Microservice
|
||||
localeTitle: الملف الفوقية ميكروسيرفيسي
|
||||
challengeType: 4
|
||||
isRequired: true
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بإنشاء تطبيق جافا سكريبت كامل المكدس الذي يشبه وظيفيًا ما يلي: <a href='https://purple-paladin.glitch.me/' target='_blank'>https://purple-paladin.glitch.me/</a> .
|
||||
سيشركك العمل في هذا المشروع في كتابة شفرتك على Glitch في مشروعنا المبدئي. بعد الانتهاء من هذا المشروع ، يمكنك نسخ عنوان URL الافتراضي الخاص بك (إلى الصفحة الرئيسية لتطبيقك) في هذه الشاشة لاختباره! اختياريًا ، يمكنك اختيار كتابة مشروعك على نظام أساسي آخر ، ولكن يجب أن يكون مرئيًا بشكل عام لاختبارنا.
|
||||
ابدأ هذا المشروع على خلل باستخدام <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-filemetadata/' target='_blank'>هذا الرابط</a> أو استنساخ <a href='https://github.com/freeCodeCamp/boilerplate-project-filemetadata/'>هذا المستودع</a> على GitHub! إذا كنت تستخدم خلل ، تذكر لحفظ الرابط لمشروعك في مكان آمن!
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يمكنني إرسال كائن FormData يتضمن تحميل ملف.
|
||||
testString: ''
|
||||
- text: "عند إرسال شيء ما ، سأتلقى حجم الملف بالبايت ضمن استجابة JSON".
|
||||
testString: ''
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,44 @@
|
||||
---
|
||||
id: bd7158d8c443edefaeb5bdff
|
||||
title: Request Header Parser Microservice
|
||||
localeTitle: طلب رأس محلل ميكروسيرفيسي
|
||||
challengeType: 4
|
||||
isRequired: true
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بإنشاء تطبيق جافا سكريبت كامل المكدس الذي يشبه وظيفيًا هذا: <a href='https://dandelion-roar.glitch.me/' target='_blank'>https://dandelion-roar.glitch.me/</a> .
|
||||
سيشركك العمل في هذا المشروع في كتابة شفرتك على Glitch في مشروعنا المبدئي. بعد الانتهاء من هذا المشروع ، يمكنك نسخ عنوان URL الافتراضي الخاص بك (إلى الصفحة الرئيسية لتطبيقك) في هذه الشاشة لاختباره! اختياريًا ، يمكنك اختيار كتابة مشروعك على نظام أساسي آخر ، ولكن يجب أن يكون مرئيًا بشكل عام لاختبارنا.
|
||||
ابدأ هذا المشروع على خلل باستخدام <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-headerparser/' target='_blank'>هذا الرابط</a> أو استنساخ <a href='https://github.com/freeCodeCamp/boilerplate-project-headerparser/'>هذا المستودع</a> على GitHub! إذا كنت تستخدم خلل ، تذكر لحفظ الرابط لمشروعك في مكان آمن!
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: "يمكنني الحصول على عنوان IP ولغة ونظام التشغيل لمتصفحي."
|
||||
testString: ''
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: bd7158d8c443edefaeb5bdef
|
||||
title: Timestamp Microservice
|
||||
localeTitle: Timestamp Microservice
|
||||
challengeType: 4
|
||||
isRequired: true
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بإنشاء تطبيق جافا سكريبت كامل المكدس الذي يشبه وظيفيًا ما يلي: <a href='https://curse-arrow.glitch.me/' target='_blank'>https://curse-arrow.glitch.me/</a> .
|
||||
سيشركك العمل في هذا المشروع في كتابة شفرتك على Glitch في مشروعنا المبدئي. بعد الانتهاء من هذا المشروع ، يمكنك نسخ عنوان URL الافتراضي الخاص بك (إلى الصفحة الرئيسية لتطبيقك) في هذه الشاشة لاختباره! اختياريًا ، يمكنك اختيار كتابة مشروعك على نظام أساسي آخر ، ولكن يجب أن يكون مرئيًا بشكل عام لاختبارنا.
|
||||
ابدأ هذا المشروع على خلل باستخدام <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-timestamp/' target='_blank'>هذا الرابط</a> أو استنساخ <a href='https://github.com/freeCodeCamp/boilerplate-project-timestamp/'>هذا المستودع</a> على GitHub! إذا كنت تستخدم خلل ، تذكر لحفظ الرابط لمشروعك في مكان آمن!
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: "يجب أن يتعامل مع تاريخ صالح ، ويعيد الطابع الزمني الصحيح لـ unix"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/api/timestamp/2016-12-25'').then(data => { assert.equal(data.unix, 1482624000000, ''Should be a valid unix timestamp''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: "يجب أن يتعامل مع تاريخ صالح ، وإرجاع سلسلة UTC الصحيحة"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'')+ ''/api/timestamp/2016-12-25'').then(data => { assert.equal(data.utc, ''Sun, 25 Dec 2016 00:00:00 GMT'', ''Should be a valid UTC date string''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: "يجب أن يتعامل مع تاريخ unix صالح ، ويعيد الطابع الزمني الصحيح لـ unix"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/api/timestamp/1482624000000'').then(data => { assert.equal(data.unix, 1482624000000) ; }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن ترجع رسالة الخطأ المتوقعة لتاريخ غير صالح
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/api/timestamp/this-is-not-a-date'').then(data => { assert.equal(data.error.toLowerCase(), ''invalid date'');}, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: "يجب معالجة معلمة تاريخ فارغة ، وإرجاع الوقت الحالي بتنسيق unix"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/api/timestamp'').then(data => { var now = Date.now(); assert.approximately(data.unix, now, 20000) ;}, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: "يجب أن يتعامل مع معلمة تاريخ فارغة ، وإرجاع الوقت الحالي بتنسيق UTC"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/api/timestamp'').then(data => { var now = Date.now(); var serverTime = (new Date(data.utc)).getTime(); assert.approximately(serverTime, now, 20000) ;}, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
id: bd7158d8c443edefaeb5bd0e
|
||||
title: URL Shortener Microservice
|
||||
localeTitle: URL Shortener Microservice
|
||||
challengeType: 4
|
||||
isRequired: true
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بإنشاء تطبيق جافا سكريبت كامل المكدس الذي يشبه وظيفيًا هذا: <a href='https://thread-paper.glitch.me/' target='_blank'>https://thread-paper.glitch.me/</a> .
|
||||
سيشركك العمل في هذا المشروع في كتابة شفرتك على Glitch في مشروعنا المبدئي. بعد الانتهاء من هذا المشروع ، يمكنك نسخ عنوان URL الافتراضي الخاص بك (إلى الصفحة الرئيسية لتطبيقك) في هذه الشاشة لاختباره! اختياريًا ، يمكنك اختيار كتابة مشروعك على نظام أساسي آخر ، ولكن يجب أن يكون مرئيًا بشكل عام لاختبارنا.
|
||||
ابدأ هذا المشروع على خلل باستخدام <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-urlshortener/' target='_blank'>هذا الرابط</a> أو استنساخ <a href='https://github.com/freeCodeCamp/boilerplate-project-urlshortener/'>هذا المستودع</a> على GitHub! إذا كنت تستخدم خلل ، تذكر لحفظ الرابط لمشروعك في مكان آمن!
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يمكنني تمرير عنوان URL كمعلمة وسيتلقى عنوان URL مختصرًا في استجابة JSON.
|
||||
testString: ''
|
||||
- text: "إذا قمت بتمرير عنوان URL غير صالح لا يتبع تنسيق http://www.example.com الصالح ، فستتضمن استجابة JSON خطأً بدلاً من ذلك".
|
||||
testString: ''
|
||||
- text: "عندما أزور عنوان URL المختصر هذا ، سيعيد توجيهي إلى الرابط الأصلي."
|
||||
testString: ''
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
id: 587d7fb1367417b2b2512bf4
|
||||
title: Chain Middleware to Create a Time Server
|
||||
localeTitle: سلسلة Middleware لإنشاء خادم الوقت
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
الوسيطة يمكن تركيبه في مسار محدد باستخدام <code>app.METHOD(path, middlewareFunction)</code> . الوسيطة يمكن أيضا أن تكون بالسلاسل داخل تعريف الطريق.
|
||||
انظر إلى المثال التالي:
|
||||
<blockquote style=";text-align:right;direction:rtl">app.get('/user', function(req, res, next) {<br> req.user = getTheUserSync(); // Hypothetical synchronous operation<br> next();<br>}, function(req, res) {<br> res.send(req.user);<br>})</blockquote>
|
||||
هذه الطريقة مفيدة لتقسيم عمليات الخادم إلى وحدات أصغر. وهذا يؤدي إلى بنية أفضل للتطبيق ، وإمكانية إعادة استخدام الرمز في أماكن مختلفة. يمكن استخدام هذا الأسلوب أيضًا لإجراء بعض التحقق من صحة البيانات. في كل نقطة من مكدس البرامج الوسيطة يمكنك منع تنفيذ التحكم في السلسلة والسلسة الحالية إلى وظائف مصممة خصيصًا للتعامل مع الأخطاء. أو يمكنك تمرير التحكم إلى المسار المطابق التالي ، للتعامل مع الحالات الخاصة. سنرى كيف في قسم Express المتقدمة.
|
||||
في مسار <code>app.get('/now', ...)</code> سلسلة وظيفة الوسيطة والمعالج النهائي. في وظيفة الوسيطة ، يجب إضافة الوقت الحالي إلى كائن الطلب في مفتاح <code>req.time</code> . يمكنك استخدام <code>new Date().toString()</code> . في المعالج ، <code>{time: req.time}</code> باستخدام كائن JSON ، مع أخذ البنية <code>{time: req.time}</code> .
|
||||
تلميح: لن يمر الاختبار إذا لم تقم بربط الوسيطة. إذا قمت بتركيب الوظيفة في مكان آخر ، سيفشل الاختبار ، حتى إذا كانت نتيجة الإخراج صحيحة.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن يكون نقطة النهاية / الآن الوسيطة المثبتة
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/chain-middleware-time'').then(data => { assert.equal(data.stackLength, 2, ''"/now" route has no mounted middleware''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن تقوم نقطة النهاية / الآن بإرجاع وقت يكون +/- 20 ثانية من الآن
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/chain-middleware-time'').then(data => { var now = new Date(); assert.isAtMost(Math.abs(new Date(data.time) - now), 20000, ''the returned time is not between +- 20 secs from now''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,51 @@
|
||||
---
|
||||
id: 587d7fb2367417b2b2512bf8
|
||||
title: Get Data from POST Requests
|
||||
localeTitle: الحصول على البيانات من طلبات POST
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بتحميل معالج POST على المسار <code>/name</code> . انها نفس الطريق كما كان من قبل. قمنا بإعداد نموذج في صفحة HTML الأمامية. وسوف يقدم نفس البيانات من التمرين 10 (سلسلة الاستعلام). إذا تم تكوين محلل الجسم بشكل صحيح ، يجب أن تجد المعلمات في الكائن <code>req.body</code> . إلقاء نظرة على المثال المعتاد للمكتبة:
|
||||
<blockquote style=";text-align:right;direction:rtl">route: POST '/library'<br>urlencoded_body: userId=546&bookId=6754 <br>req.body: {userId: '546', bookId: '6754'}</blockquote>
|
||||
رد باستخدام نفس كائن JSON كما كان من قبل: <code>{name: 'firstname lastname'}</code> . اختبر إذا كانت نقطة النهاية تعمل باستخدام نموذج html الذي قدمناه في صفحة التطبيق الأولى.
|
||||
نصيحة: هناك العديد من طرق http الأخرى بخلاف GET و POST. وبموجب الاتفاقية هناك تناظر بين الفعل http ، والعملية التي ستنفذها على الخادم. التعيين التقليدي هو:
|
||||
POST (أحيانًا PUT) - إنشاء مورد جديد باستخدام المعلومات المرسلة مع الطلب ،
|
||||
GET - قراءة مورد موجود بدون تعديله ،
|
||||
PUT أو PATCH (أحيانًا POST) - تحديث مورد باستخدام البيانات تم الإرسال ،
|
||||
DELETE => حذف مورد.
|
||||
هناك أيضًا طريقتين أخريين تستخدمان للتفاوض على اتصال بالخادم. باستثناء GET ، يمكن أن تحتوي جميع الطرق الأخرى المذكورة أعلاه على حمولة (أي البيانات في نص الطلب). يعمل الوسيطة محلل الجسم مع هذه الأساليب كذلك.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: "الاختبار 1: يجب أن تستجيب نقطة نهاية API الخاصة بك بالاسم الصحيح"
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/name'', {first: ''Mick'', last: ''Jagger''}).then(data => { assert.equal(data.name, ''Mick Jagger'', ''Test 1: "POST /name" route does not behave as expected'') }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: "الاختبار 2: يجب أن تستجيب نقطة نهاية API الخاصة بك بالاسم الصحيح"
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/name'', {first: ''Keith'', last: ''Richards''}).then(data => { assert.equal(data.name, ''Keith Richards'', ''Test 2: "POST /name" route does not behave as expected'') }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 587d7fb2367417b2b2512bf6
|
||||
title: Get Query Parameter Input from the Client
|
||||
localeTitle: الحصول على إدخال معلمة طلب البحث من العميل
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
طريقة شائعة أخرى للحصول على مدخلات من العميل هي بتشفير البيانات بعد مسار المسار ، باستخدام سلسلة استعلام. تكون سلسلة الاستعلام محددة بعلامة استفهام (؟) ، وتتضمن أزواج الحقل = القيمة. يتم فصل كل زوجين بواسطة علامة العطف (&). يمكن لـ Express تحليل البيانات من سلسلة الاستعلام ، <code>req.query</code> الكائن <code>req.query</code> . لا يمكن أن تكون بعض الأحرف في عناوين URL ، يجب أن يتم ترميزها <a href='https://en.wikipedia.org/wiki/Percent-encoding' target='_blank'>بتنسيق مختلف</a> قبل أن تتمكن من إرسالها. إذا كنت تستخدم واجهة برمجة التطبيقات من جافا سكريبت ، فيمكنك استخدام طرق محددة لتشفير / فك تشفير هذه الأحرف.
|
||||
<blockquote style=";text-align:right;direction:rtl">route_path: '/library'<br>actual_request_URL: '/library?userId=546&bookId=6754' <br>req.query: {userId: '546', bookId: '6754'}</blockquote>
|
||||
إنشاء نقطة نهاية API ، محملة على <code>GET /name</code> . الرد باستخدام مستند JSON ، مع أخذ البنية <code>{ name: 'firstname lastname'}</code> . يجب ترميز معلمات الاسم الأول والأخير في سلسلة استعلام على سبيل المثال: <code>?first=firstname&last=lastname</code> .
|
||||
نصيحة: سنقوم في التمرين التالي بتلقي بيانات من طلب POST ، على نفس مسار مسار <code>/name</code> . إذا كنت تريد يمكنك استخدام الطريقة <code>app.route(path).get(handler).post(handler)</code> . تسمح لك هذه البنية بسلسلة معالجات الأفعال المختلفة على نفس مسار المسار. يمكنك حفظ جزء من الكتابة ، والحصول على رمز أنظف.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: "الاختبار 1: يجب أن تستجيب نقطة نهاية API الخاصة بك بالاسم الصحيح"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/name?first=Mick&last=Jagger'').then(data => { assert.equal(data.name, ''Mick Jagger'', ''Test 1: "GET /name" route does not behave as expected'') }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: "الاختبار 2: يجب أن تستجيب نقطة نهاية APi الخاصة بك بالاسم الصحيح"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/name?last=Richards&first=Keith'').then(data => { assert.equal(data.name, ''Keith Richards'', ''Test 2: "GET /name" route does not behave as expected'') }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,45 @@
|
||||
---
|
||||
id: 587d7fb2367417b2b2512bf5
|
||||
title: Get Route Parameter Input from the Client
|
||||
localeTitle: الحصول على إدخال معلمة المسار من العميل
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
عند إنشاء واجهة برمجة التطبيقات ، يتعين علينا السماح للمستخدمين بالاتصال بنا بما يريدون الحصول عليه من خدمتنا. على سبيل المثال ، إذا كان العميل يطلب معلومات حول مستخدم مخزّن في قاعدة البيانات ، فيحتاج إلى طريقة لإعلامنا بالمستخدم الذي يهتم به. تتمثل إحدى الطرق الممكنة لتحقيق هذه النتيجة في استخدام معلمات المسار. تدعى معلمات المسار أجزاء من عنوان URL ، مفصولة بشرائط مائلة (/). يلتقط كل مقطع قيمة جزء عنوان URL الذي يطابق موقعه. يمكن العثور على القيم التي تم التقاطها في كائن <code>req.params</code> .
|
||||
<blockquote style=";text-align:right;direction:rtl">route_path: '/user/:userId/book/:bookId'<br>actual_request_URL: '/user/546/book/6754' <br>req.params: {userId: '546', bookId: '6754'}</blockquote>
|
||||
إنشاء ملقم صدى ، التي شنت على الطريق <code>GET /:word/echo</code> . الرد باستخدام كائن JSON ، مع أخذ بنية <code>{echo: word}</code> . يمكنك العثور على الكلمة المراد تكرارها على <code>req.params.word</code> . يمكنك اختبار مسارك من شريط العناوين بالمتصفح ، وزيارة بعض المسارات المطابقة ، على سبيل المثال your-app-rootpath / freecodecamp / echo
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: "الاختبار 1: يجب أن يكرر خادم الصدى الكلمات بشكل صحيح"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/eChOtEsT/echo'').then(data => { assert.equal(data.echo, ''eChOtEsT'', ''Test 1: the echo server is not working as expected'') }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: "الاختبار 2: يجب أن يكرر خادم الصدى الكلمات بشكل صحيح"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/ech0-t3st/echo'').then(data => { assert.equal(data.echo, ''ech0-t3st'', ''Test 2: the echo server is not working as expected'') }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,47 @@
|
||||
---
|
||||
id: 587d7fb1367417b2b2512bf3
|
||||
title: Implement a Root-Level Request Logger Middleware
|
||||
localeTitle: تنفيذ برنامج Logware Logger Logger على مستوى الجذر
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
قبل أن نقدم وظيفة الوسيطة <code>express.static()</code> . الآن حان الوقت لنرى ما هي الوسيطة ، بمزيد من التفصيل. دالات الوسيطية هي الدوال التي تأخذ 3 حجج: كائن الطلب ، كائن الاستجابة ، والدالة التالية في دورة طلب-استجابة التطبيق. هذه الوظائف تنفيذ بعض التعليمات البرمجية التي يمكن أن يكون لها آثار جانبية على التطبيق ، وعادة ما تضيف المعلومات إلى الكائنات استجابة أو طلب. يمكنهم أيضًا إنهاء دورة إرسال الاستجابة ، عند استيفاء بعض الشروط. إذا لم يرسلوا الاستجابة ، فعند الانتهاء من ذلك ، يبدأون تنفيذ الوظيفة التالية في المكدس. يتم تشغيل هذا استدعاء الوسيطة الثالثة <code>next()</code> . مزيد من المعلومات في <a href='http://expressjs.com/en/guide/using-middleware.html' target='_blank'>الوثائق السريعة</a> .
|
||||
انظر إلى المثال التالي:
|
||||
<blockquote style=";text-align:right;direction:rtl">function(req, res, next) {<br> console.log("I'm a middleware...");<br> next();<br>}</blockquote>
|
||||
دعونا نفترض أننا شنت هذه الوظيفة على الطريق. عندما يطابق أحد الطلبات المسار ، فإنه يعرض السلسلة "أنا برنامج وسيط ...". ثم ينفذ الوظيفة التالية في المكدس.
|
||||
في هذا التمرين ، سنقوم ببناء برنامج وسيط بمستوى الجذر. كما رأينا في التحدي 4 ، لتركيب وظيفة الوسيطة على مستوى الجذر يمكننا استخدام طريقة <code>app.use(<mware-function>)</code> . في هذه الحالة ، سيتم تنفيذ الوظيفة لجميع الطلبات ، ولكن يمكنك أيضًا تعيين شروط أكثر تحديدًا. على سبيل المثال ، إذا كنت تريد تنفيذ دالة فقط لطلبات POST ، فيمكنك استخدام <code>app.post(<mware-function>)</code> . توجد أساليب مماثلة لجميع الأفعال http (GET، DELETE، PUT،…).
|
||||
بناء بسيط المسجل. لكل طلب ، يجب عليه تسجيل الدخول في وحدة التحكم سلسلة أخذ التنسيق التالي: <code>method path - ip</code> . قد يبدو المثال: <code>GET /json - ::ffff:127.0.0.1</code> . لاحظ أن هناك مسافة بين <code>method</code> و <code>path</code> وأن اندفاعة فصل <code>path</code> و <code>ip</code> وتحيط به مساحة على جانبي. يمكنك الحصول على طريقة الطلب (الفعل المتشعب) ، ومسار المسار النسبي ، <code>req.method</code> المتصل من كائن الطلب ، باستخدام <code>req.method</code> ، <code>req.path</code> و <code>req.ip</code> تذكر الاتصال <code>next()</code> عند الانتهاء ، أو أن الخادم الخاص بك سيكون عالقاً إلى الأبد. تأكد من فتح "السجلات" ، وشاهد ما سيحدث عند وصول بعض الطلبات ...
|
||||
تلميح: يقوم Express بتقييم الوظائف بالترتيب الذي تظهر به في التعليمة البرمجية. هذا صحيح على الوسيطة أيضا. إذا كنت تريد أن تعمل في جميع المسارات ، فيجب تثبيتها قبلها.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تكون البرامج الوسيطة لمسجل المستوى الجذر نشطة
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/root-middleware-logger'').then(data => { assert.isTrue(data.passed, ''root-level logger is not working as expected''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 587d7fb0367417b2b2512bed
|
||||
title: Meet the Node console
|
||||
localeTitle: تعرف على وحدة التحكم في العقدة
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
أثناء عملية التطوير ، من المهم أن تكون قادراً على التحقق من ما يجري في التعليمات البرمجية. العقدة هي مجرد بيئة جافا سكريبت. مثل جافا سكريبت من جانب العميل ، يمكنك استخدام وحدة التحكم لعرض معلومات تصحيح الأخطاء المفيدة. على جهازك المحلي ، سترى إخراج وحدة التحكم في جهاز طرفي. على خلل ، يمكنك فتح السجلات في الجزء السفلي من الشاشة. يمكنك تبديل لوحة السجل بزر "سجلات" الزر (أعلى اليسار ، تحت اسم التطبيق).
|
||||
للبدء ، ما عليك سوى طباعة "Hello World" الكلاسيكية في وحدة التحكم. نوصي بإبقاء لوحة السجلات مفتوحة أثناء العمل على مواجهة هذه التحديات. قراءة السجلات يمكنك أن تكون على علم بطبيعة الأخطاء التي قد تحدث.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
قم بتعديل الملف <code>myApp.js</code> لتسجيل "Hello World" إلى وحدة التحكم.
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن يكون <code>"Hello World"</code> في وحدة التحكم
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/hello-console'').then(data => { assert.isTrue(data.passed, ''"Hello World" is not in the server console''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,45 @@
|
||||
---
|
||||
id: 587d7fb0367417b2b2512bef
|
||||
title: Serve an HTML File
|
||||
localeTitle: تخدم ملف HTML
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
يمكننا الرد باستخدام ملف باستخدام الطريقة <code>res.sendFile(path)</code> .
|
||||
يمكنك وضعه داخل <code>app.get('/', ...)</code> توجيه <code>app.get('/', ...)</code> . وراء الكواليس ، تقوم هذه الطريقة بتعيين الرؤوس المناسبة لإرشاد المتصفح الخاص بك حول كيفية التعامل مع الملف الذي تريد إرساله ، وفقًا لنوعه. ثم سوف يقرأ ويرسل الملف. هذه الطريقة تحتاج إلى مسار ملف مطلق. نوصي باستخدام المتغير العام <code>__dirname</code> لحساب المسار.
|
||||
سبيل المثال <code>absolutePath = __dirname + relativePath/file.ext</code> .
|
||||
الملف المطلوب إرساله هو <code>/views/index.html</code> . جرِّب "إظهار تطبيقك" ، يجب أن تشاهد عنوان HTML كبيرًا (ونموذجًا سنستخدمه لاحقًا ...) ، دون تطبيق أي أسلوب.
|
||||
ملاحظة: يمكنك تحرير حل التحدي السابق ، أو إنشاء حل جديد. إذا قمت بإنشاء حل جديد ، فضع في اعتبارك أن Express يقيم المسارات من الأعلى إلى الأسفل. ينفذ المعالج للمباراة الأولى. يجب عليك التعليق على الحل السابق ، أو سيستمر الخادم في الاستجابة باستخدام سلسلة.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن يخدم تطبيقك ملف المشاهدات / index.html
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'')).then(data => { assert.match(data, /<h1>.*<\/h1>/, ''Your app does not serve the expected HTML''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,43 @@
|
||||
---
|
||||
id: 587d7fb1367417b2b2512bf1
|
||||
title: Serve JSON on a Specific Route
|
||||
localeTitle: خدمة JSON على طريق معين
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بينما يخدم خادم HTML (الذي خمنته!) HTML ، فإن واجهة برمجة التطبيقات تخدم البيانات. تسمح واجهة برمجة التطبيقات (Rpresentational State Transfer) <dfn>REST</dfn> بتبادل البيانات بطريقة بسيطة ، دون الحاجة إلى معرفة العملاء لأي تفاصيل حول الخادم. يحتاج العميل فقط إلى معرفة مصدر المورد (عنوان URL) والإجراء الذي يريد تنفيذه عليه (الفعل). يتم استخدام الفعل GET عندما تقوم بجلب بعض المعلومات ، دون تعديل أي شيء. في هذه الأيام ، يكون تنسيق البيانات المفضل لنقل المعلومات عبر الويب هو JSON. ببساطة ، JSON هي طريقة ملائمة لتمثيل كائن JavaScript كسلسلة ، بحيث يمكن نقله بسهولة.
|
||||
لنقم بإنشاء واجهة برمجة تطبيقات بسيطة عن طريق إنشاء مسار يستجيب مع JSON على المسار <code>/json</code> . يمكنك القيام بذلك كالمعتاد ، مع طريقة <code>app.get()</code> . داخل معالج المسار ، استخدم الطريقة <code>res.json()</code> ، وتمريرها في كائن كوسيطة. تغلق هذه الطريقة حلقة الطلب-الاستجابة ، وتعيد البيانات. وراء الكواليس ، يقوم بتحويل كائن جافا سكريبت صالح إلى سلسلة ، ثم يقوم بتعيين الرؤوس المناسبة لإخبار المتصفح أنك تخدم JSON ، ويرسل البيانات مرة أخرى. يحتوي الكائن الصحيح على البنية المعتادة <code>{key: data}</code> . يمكن البيانات با رقم ، سلسلة ، كائن متداخل أو مصفوفة. يمكن أن تكون البيانات أيضًا متغيرًا أو نتيجة استدعاء دالة ؛ في هذه الحالة سيتم تقييمه قبل تحويله إلى سلسلة.
|
||||
خدمة الكائن <code>{"message": "Hello json"}</code> كاستجابة في تنسيق JSON ، إلى طلبات GET إلى المسار <code>/json</code> . ثم أشر المتصفح الخاص بك إلى التطبيق الخاص بك-رابط / json ، يجب أن تشاهد الرسالة على الشاشة.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: "يجب أن تخدم نقطة النهاية <code>/json</code> كائن json <code>{"message": "Hello json"}</code> "
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/json'').then(data => { assert.equal(data.message, ''Hello json'', ''The \''/json\'' endpoint does not serve the right data''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,43 @@
|
||||
---
|
||||
id: 587d7fb0367417b2b2512bf0
|
||||
title: Serve Static Assets
|
||||
localeTitle: خدمة الأصول الثابتة
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
يحتوي خادم HTML عادة على واحد أو أكثر من الدلائل التي يمكن الوصول إليها من قبل المستخدم. يمكنك وضع الأصول الثابتة التي يحتاج إليها التطبيق الخاص بك (أوراق الأنماط ، البرامج النصية ، الصور). في Express يمكنك وضع هذه الوظيفة باستخدام الوسيطة <code>express.static(path)</code> ، حيث تكون المعلمة هي المسار المطلق للمجلد الذي يحتوي على الأصول. إذا كنت لا تعرف ما هي الوسيطة ، فلا تقلق. سنناقشها فيما بعد بالتفصيل. في المقام الأول الوسيطة هي وظائف تعترض معالجات الطريق ، تضيف نوعا من المعلومات. تحتاج الوسيطة <code>app.use(path, middlewareFunction)</code> باستخدام طريقة <code>app.use(path, middlewareFunction)</code> . وسيطة المسار الأول اختيارية. إذا لم تنجح ، سيتم تنفيذ الوسيطة لجميع الطلبات.
|
||||
<code>app.use()</code> البرامج الوسيطة <code>express.static()</code> لكافة الطلبات باستخدام <code>app.use()</code> . المسار المطلق لمجلد الأصول هو <code>__dirname + /public</code> .
|
||||
يجب أن يكون تطبيقك الآن قادرًا على تقديم ورقة أنماط CSS. من خارج المجلد العام سوف تظهر محملة إلى الدليل الجذر. من المفترض أن تبدو صفحتك الأولى أفضل قليلاً الآن!
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن يخدم تطبيقك ملفات مواد العرض من الدليل <code>/public</code>
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/style.css'').then(data => { assert.match(data, /body\s*\{[^\}]*\}/, ''Your app does not serve static assets''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 587d7fb0367417b2b2512bee
|
||||
title: Start a Working Express Server
|
||||
localeTitle: بدء تشغيل ملقم Express العمل
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
في أول سطرين من الملف myApp.js يمكنك أن ترى كيف أنه من السهل إنشاء كائن تطبيق Express. يحتوي هذا الكائن على عدة طرق ، وسوف نتعلم الكثير منها في هذه التحديات. إحدى الطرق الأساسية هي <code>app.listen(port)</code> . فإنه يخبر الخادم الخاص بك للاستماع على منفذ معين ، ووضعها في حالة تشغيل. يمكنك رؤيتها في أسفل الملف. من داخل التعليقات لأننا نحتاج إلى تشغيل التطبيق في الخلفية لأسباب اختبار. كل التعليمات البرمجية التي قد ترغب في إضافتها تنتقل بين هذين الجزأين الأساسيين. يقوم Glitch بتخزين رقم المنفذ في <code>process.env.PORT</code> متغير البيئة. قيمتها <code>3000</code> .
|
||||
دعونا نخدم أول سلسلة لدينا! في Express ، تأخذ المسارات البنية التالية: <code>app.METHOD(PATH, HANDLER)</code> . الطريقة هي طريقة http في الأحرف الصغيرة. PATH هو مسار نسبي على الخادم (يمكن أن يكون عبارة عن سلسلة أو حتى تعبير عادي). HANDLER هي وظيفة يقوم Express باستدعاءها عند مطابقة المسار.
|
||||
تأخذ معالجات <code>function(req, res) {...}</code> الشكل <code>function(req, res) {...}</code> ، حيث req هي كائن الطلب ، و res هو كائن الاستجابة. على سبيل المثال ، المعالج
|
||||
<blockquote style=";text-align:right;direction:rtl">function(req, res) {<br> res.send('Response String');<br>}</blockquote>
|
||||
سيخدم السلسلة "سلسلة الاستجابة".
|
||||
استخدم طريقة <code>app.get()</code> لعرض سلسلة Hello Express ، لطلبات GET التي تطابق مسار / root. تأكد من عمل التعليمات البرمجية الخاصة بك بالنظر إلى السجلات ، ثم انظر النتائج في المستعرض الخاص بك ، والنقر فوق الزر 'إظهار Live' في واجهة المستخدم Glitch UI.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن يخدم تطبيقك السلسلة "Hello Express"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'')).then(data => { assert.equal(data, ''Hello Express'', ''Your app does not serve the text "Hello Express"''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,48 @@
|
||||
---
|
||||
id: 587d7fb2367417b2b2512bf7
|
||||
title: Use body-parser to Parse POST Requests
|
||||
localeTitle: استخدام محلل body to Parse POST الطلبات
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بالإضافة إلى GET هناك فعل http شائع آخر ، هو POST. POST هي الطريقة الافتراضية المستخدمة لإرسال بيانات العميل بنماذج HTML. في REST convention يستخدم POST لإرسال البيانات لإنشاء عناصر جديدة في قاعدة البيانات (مستخدم جديد ، أو مشاركة مدونة جديدة). لا توجد لدينا قاعدة بيانات في هذا المشروع ، لكننا سنتعلم كيفية التعامل مع طلبات POST على أي حال.
|
||||
في هذا النوع من الطلبات لا تظهر البيانات في عنوان URL ، تكون مخفية في نص الطلب. هذا جزء من طلب HTML ، ويسمى أيضًا الحمولة. نظرًا لأن HTML يعتمد على النص ، حتى إذا لم تكن ترى البيانات ، فهذا لا يعني أنها سرية. يتم عرض المحتوى الأساسي لطلب HTTP POST أدناه:
|
||||
<blockquote style=";text-align:right;direction:rtl">POST /path/subpath HTTP/1.0<br>From: john@example.com<br>User-Agent: someBrowser/1.0<br>Content-Type: application/x-www-form-urlencoded<br>Content-Length: 20<br>name=John+Doe&age=25</blockquote>
|
||||
كما ترى ، يتم تشفير الجسم مثل سلسلة الاستعلام. هذا هو التنسيق الافتراضي المستخدم في نماذج HTML. مع Ajax يمكننا أيضا استخدام JSON لتكون قادرة على التعامل مع البيانات التي لديها بنية أكثر تعقيدا. هناك أيضًا نوع آخر من الترميز: multipart / form-data. هذا واحد يستخدم لتحميل الملفات الثنائية.
|
||||
في هذا التمرين ، سنستخدم هيئة urlencoded.
|
||||
لتحليل البيانات الواردة من طلبات POST ، يجب عليك تثبيت حزمة: محلل الجسم. تتيح لك هذه الحزمة استخدام سلسلة من البرامج الوسيطة ، والتي يمكن أن تفك شفرة البيانات بتنسيقات مختلفة. شاهد المستندات <a href="https://github.com/expressjs/body-parser" target="_blank" >هنا</a> .
|
||||
قم بتثبيت وحدة تحليل الجسم في الحزمة. json. ثم تطلب ذلك في الجزء العلوي من الملف. قم بتخزينه في متغير اسمه bodyParser.
|
||||
يتم إرجاع الوسيطة لمعالجة البيانات المشفرة بواسطة <code>bodyParser.urlencoded({extended: false})</code> . <code>extended=false</code> هو خيار تكوين يخبر المحلل باستخدام التشفير التقليدي. عند استخدامه ، يمكن أن تكون القيم سلاسل أو صفائف فقط. النسخة الموسعة تسمح بمرونة أكبر للبيانات ، ولكن يفوقها JSON. تمرير إلى <code>app.use()</code> الدالة التي تم إرجاعها بواسطة استدعاء الأسلوب السابق. كالعادة ، يجب تركيب الوسيطة قبل كل الطرق التي تحتاجها.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب تركيب الوسيطة 'body-parser'
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/add-body-parser'').then(data => { assert.isAbove(data.mountedAt, 0, ''"body-parser" is not mounted correctly'') }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,43 @@
|
||||
---
|
||||
id: 587d7fb1367417b2b2512bf2
|
||||
title: Use the .env File
|
||||
localeTitle: استخدم ملف .env
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
الملف <code>.env</code> عبارة عن ملف مخفي يستخدم لتمرير متغيرات البيئة إلى التطبيق الخاص بك. هذا الملف سري ، لا أحد ولكن يمكنك الوصول إليه ، ويمكن استخدامه لتخزين البيانات التي تريد الاحتفاظ بها خاصة أو مخفية. على سبيل المثال ، يمكنك تخزين مفاتيح API من الخدمات الخارجية أو عنوان URI الخاص بقاعدة البيانات. يمكنك أيضًا استخدامه لتخزين خيارات التهيئة. عن طريق إعداد خيارات التكوين ، يمكنك تغيير سلوك التطبيق الخاص بك ، دون الحاجة إلى إعادة كتابة بعض التعليمات البرمجية.
|
||||
يمكن الوصول إلى متغيرات البيئة من التطبيق مثل <code>process.env.VAR_NAME</code> . الكائن <code>process.env</code> هو كائن عقدة عمومي ، ويتم تمرير المتغيرات كسلسلة. حسب الاصطلاح ، أسماء المتغيرات كلها أحرف كبيرة ، مع الكلمات مفصولة تسطير سفلي. <code>.env</code> عبارة عن ملف shell ، لذلك لا تحتاج إلى التفاف الأسماء أو القيم بين علامتي اقتباس. من المهم أيضًا ملاحظة أنه لا يمكن توفير مسافة حول علامة equals عند تعيين قيم للمتغيرات ، مثل <code>VAR_NAME=value</code> . عادة ، ستضع كل تعريف متغير على سطر منفصل.
|
||||
دعونا إضافة متغير بيئة كخيار التكوين. قم بتخزين متغير <code>MESSAGE_STYLE=uppercase</code> في ملف <code>.env</code> . ثم أخبر معالج مسار GET <code>/json</code> الذي قمت بإنشائه في التحدي الأخير لتحويل رسالة كائن الاستجابة إلى أحرف كبيرة إذا كانت <code>process.env.MESSAGE_STYLE</code> تساوي <code>uppercase</code> . يجب أن يصبح كائن الاستجابة <code>{"message": "HELLO JSON"}</code> .
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تتغير استجابة نقطة النهاية <code>/json</code> طبقًا لمتغير البيئة <code>MESSAGE_STYLE</code>
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/use-env-vars'').then(data => { assert.isTrue(data.passed, ''The response of "/json" does not change according to MESSAGE_STYLE''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,47 @@
|
||||
---
|
||||
id: 587d7fb3367417b2b2512bfc
|
||||
title: Add a Description to Your package.json
|
||||
localeTitle: أضف وصفًا إلى الحزمة. json
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
الجزء التالي من حزمة جيدة. json هو حقل الوصف ، حيث ينتمي وصف قصير ولكن غني بالمعلومات عن مشروعك.
|
||||
إذا كنت تخطط في يوم ما لنشر حزمة إلى npm ، تذكر أن هذه هي السلسلة التي يجب أن تبيع فكرتك للمستخدم عندما يقررون تثبيت الحزمة الخاصة بك أم لا. ومع ذلك ، هذه ليست حالة الاستخدام الوحيدة للوصف: إنها طريقة رائعة لتلخيص ما يفعله المشروع ، لا يقل أهمية عن مشاريع Node.js العادية لمساعدة مطورين آخرين ، أو مشرفين مستقبليين أو حتى مستقبلك على فهم المشروع. بسرعة.
|
||||
بغض النظر عن ما كنت تخطط لمشروعك، وأوصت بالتأكيد وصفا. دعونا نضيف شيئًا مشابهًا لهذا:
|
||||
<code>"description": "A project that does something awesome",</code>
|
||||
إرشادات
|
||||
أضف وصفًا إلى الحزمة package.json في مشروع Glitch.
|
||||
تذكر لاستخدام علامات الاقتباس المزدوجة لأسماء المجال ( ") والفواصل (،) للفصل بين الحقول.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: package.json يجب أن يكون مفتاح "وصف" صالح
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert(packJson.description, ''"description" is missing''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,47 @@
|
||||
---
|
||||
id: 587d7fb4367417b2b2512bfe
|
||||
title: Add a License to Your package.json
|
||||
localeTitle: إضافة ترخيص إلى الحزمة الخاصة بك
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
حقل الترخيص هو المكان الذي تبلغ المستخدمين فيه بمشروعك المسموح لهم القيام به.
|
||||
بعض التراخيص المشتركة لمشاريع مفتوحة المصدر تشمل MIT و BSD. يعد http://choosealicense.com موردًا رائعًا إذا كنت تريد معرفة المزيد حول الترخيص الذي يمكن أن يناسب مشروعك.
|
||||
معلومات الترخيص غير مطلوبة. ستمنحك قوانين حقوق الطبع والنشر في معظم البلدان ملكية ما تنشئه افتراضيًا. ومع ذلك ، فمن الأفضل دائمًا تحديد ما يمكن للمستخدمين فعله وما لا يمكنهم فعله.
|
||||
مثال
|
||||
<code>"license": "MIT",</code>
|
||||
تعليمات
|
||||
قم بتعبئة حقل الترخيص في الحزمة. json من مشروع Glitch الخاص بك كما تجد مناسبة.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: package.json يجب أن يكون مفتاح "ترخيص" صالح
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert(packJson.license, ''"license" is missing''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,45 @@
|
||||
---
|
||||
id: 587d7fb4367417b2b2512bff
|
||||
title: Add a Version to Your package.json
|
||||
localeTitle: أضف إصدارًا إلى الحزمة الخاصة بك. json
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
الإصدار مع اسم واحد من الحقول المطلوبة في package.json. يصف هذا الحقل الإصدار الحالي لمشروعك.
|
||||
مثال
|
||||
<code>"version": "1.2",</code>
|
||||
Instruction
|
||||
بإضافة نسخة إلى package.json في مشروع Glitch الخاص بك.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: package.json يجب أن يكون لديك مفتاح "إصدار" صالح
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert(packJson.version, ''"version" is missing''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,51 @@
|
||||
---
|
||||
id: 587d7fb4367417b2b2512bfd
|
||||
title: Add Keywords to Your package.json
|
||||
localeTitle: أضف كلمات رئيسية إلى package.json الخاص بك
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
حقل الكلمات الرئيسية هو المكان الذي يمكنك فيه وصف مشروعك باستخدام الكلمات الرئيسية ذات الصلة.
|
||||
مثال
|
||||
<code>"keywords": [ "descriptive", "related", "words" ],</code>
|
||||
كما ترى ، يتم تنظيم هذا الحقل على هيئة مصفوفة من سلاسل مقتبسة مزدوجة.
|
||||
إرشادات
|
||||
أضف مصفوفة من السلاسل المناسبة إلى حقل الكلمات الرئيسية في الحزمة. json من مشروع Glitch.
|
||||
يجب أن تكون واحدة من الكلمات الأساسية freecodecamp.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن يحتوي package.json على مفتاح "كلمات رئيسية" صالح
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert(packJson.keywords, ''"keywords" is missing''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن يكون حقل "الكلمات الرئيسية" مصفوفة
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.isArray(packJson.keywords, ''"keywords" is not an array''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن تتضمن "الكلمات الرئيسية" "freecodecamp"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.include(packJson.keywords, ''freecodecamp'', ''"keywords" does not include "freecodecamp"''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,51 @@
|
||||
---
|
||||
id: 587d7fb4367417b2b2512c00
|
||||
title: Expand Your Project with External Packages from npm
|
||||
localeTitle: توسيع المشروع الخاص بك مع الحزم الخارجية من npm
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
واحدة من أكبر الأسباب لاستخدام مدير الحزمة هي إدارة التبعية القوية. بدلاً من الاضطرار يدويًا إلى التأكد من حصولك على جميع الاعتمادات عندما تقوم بإعداد مشروع على كمبيوتر جديد ، يقوم npm تلقائيًا بتثبيت كل شيء لك. ولكن كيف يمكن لـ npm أن تعرف بالضبط ما يحتاجه مشروعك؟ تعرّف على قسم التبعيات في الحزمة. json.
|
||||
في قسم التبعيات ، يتم تخزين الحزم التي تحتاجها مشروعك باستخدام التنسيق التالي:
|
||||
<code>"dependencies": {</code>
|
||||
<code>"package-name": "version",</code>
|
||||
<code>"express": "4.14.0"</code>
|
||||
<code>}</code>
|
||||
إرشادات
|
||||
قم بإضافة الإصدار 2.14.0 من حزمة الحزم إلى حقل التبعيات الخاص بك من package.json
|
||||
Moment هي مكتبة مفيدة للعمل مع الوقت والتواريخ.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تتضمن "التبعيات" "لحظة"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.property(packJson.dependencies, ''moment'', ''"dependencies" does not include "moment"''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن يكون إصدار "اللحظة" هو "2.14.0"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.match(packJson.dependencies.moment, /^[\^\~]?2\.14\.0/, ''Wrong version of "moment" installed. It should be 2.14.0''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,50 @@
|
||||
---
|
||||
id: 587d7fb3367417b2b2512bfb
|
||||
title: 'How to Use package.json, the Core of Any Node.js Project or npm Package'
|
||||
localeTitle: "كيفية استخدام package.json ، أو Core of Any Node.js Project أو npm Package"
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
إن ملف package.json هو مركز أي مشروع Node.js أو حزمة npm. يخزن معلومات حول مشروعك تمامًا مثل <head> - يصف القسم في مستند HTML محتوى صفحة الويب. يتكون package.json من كائن JSON واحد حيث يتم تخزين المعلومات في "مفتاح": أزواج القيم. لا يوجد سوى حقلين مطلوبين في الحد الأدنى من package.json - الاسم والإصدار - إلا أنه من الممارسات الجيدة توفير معلومات إضافية حول مشروعك يمكن أن تكون مفيدة للمستخدمين أو مشرفين المستقبل.
|
||||
حقل المؤلف
|
||||
إذا ذهبت إلى مشروع Glitch الذي قمت بإعداده سابقًا وانظرت إلى الجانب الأيسر من شاشتك ، فستجد شجرة الملفات حيث يمكنك رؤية نظرة عامة على مختلف الملفات في مشروعك. ضمن القسم الخلفي لشجرة الملفات ، ستجد حزمة package.json - الملف الذي سنحسّنه في التحديين التاليين.
|
||||
أحد أكثر أجزاء المعلومات شيوعًا في هذا الملف هو حقل المؤلف الذي يحدد منشئ المشروع. يمكن أن يكون إما سلسلة أو كائن مع تفاصيل الاتصال. الهدف موصى به للمشاريع الأكبر ، ولكن في حالتنا ، سوف تفعل سلسلة بسيطة مثل المثال التالي.
|
||||
<code>"author": "Jane Doe",</code>
|
||||
Instructions
|
||||
أضف اسمك إلى حقل المؤلف في الحزمة. json لمشروع Glitch.
|
||||
تذكر أنك تكتب JSON.
|
||||
يجب أن تستخدم جميع أسماء الحقول علامات اقتباس مزدوجة (") ، على سبيل المثال" المؤلف "
|
||||
يجب فصل جميع الحقول بفاصلة (،)
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: package.json يجب أن يكون مفتاح "المؤلف" صالح
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert(packJson.author, ''"author" is missing''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,56 @@
|
||||
---
|
||||
id: 587d7fb5367417b2b2512c01
|
||||
title: Manage npm Dependencies By Understanding Semantic Versioning
|
||||
localeTitle: إدارة التبعيات npm عن طريق فهم الإصدار الدلالي
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
إصدارات من حزم npm في قسم التبعيات من package.json الخاص بك يتبع ما يسمى بإصدار Semantic (SemVer) ، وهو معيار صناعي لإصدارات البرامج التي تهدف إلى تسهيل إدارة التبعيات. يجب أن تستخدم المكتبات وأطر العمل أو غيرها من الأدوات المنشورة على npm نظام SemVer من أجل إيصال نوع التغييرات التي يمكن للمشاريع التي تعتمد على الحزمة أن تتوقع إذا تم تحديثها.
|
||||
SemVer لا معنى له في مشاريع دون واجهات برمجة التطبيقات العامة - وذلك ما لم مشروع مشابه لالأمثلة أعلاه، استخدم شكل إصدارات أخرى.
|
||||
لماذا تحتاج لفهم SemVer؟
|
||||
معرفة SemVer يمكن أن تكون مفيدة عند تطوير البرمجيات التي تستخدم الاعتماد على الخارج (والتي تفعل دائما تقريبا). في يوم من الأيام ، سيوفر لك فهمك لهذه الأرقام من إدخال تغييرات مفاجئة إلى مشروعك دون فهم لماذا لا تسير الأمور "التي عملت بالأمس" فجأة.
|
||||
هذه هي الطريقة التي يعمل بها الإصدار الدارجة وفقًا للموقع الرسمي:
|
||||
بالنظر إلى رقم الإصدار MAJOR.MINOR.PATCH ، قم بزيادة:
|
||||
إصدار رئيسي عند إجراء تغييرات غير متوافقة على واجهة برمجة التطبيقات ، إصدار
|
||||
MINOR عند إضافة وظائف بطريقة متوافقة إلى الخلف و
|
||||
الإصدار PATCH عند إجراء إصلاحات الأخطاء المتوافقة.
|
||||
وهذا يعني أن PATCHes هي إصلاحات للأخطاء ، وإضافة MINORs إلى ميزات جديدة ، ولكن لا أحد منهما يكسر ما نجح من قبل. وأخيرًا ، تضيف MAJORs تغييرات لن تعمل مع الإصدارات السابقة.
|
||||
مثال
|
||||
رقم إصدار لغوي: 1.3.8
|
||||
إرشادات
|
||||
في قسم التبعيات في الحزمة الخاصة بك. json ، قم بتغيير إصدار اللحظة لمطابقة الإصدار 2 من MAJOR والإصدار 10 من MINOR والإصدار PATCH 2
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تتضمن "التبعيات" "لحظة"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.property(packJson.dependencies, ''moment'', ''"dependencies" does not include "moment"''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن يكون إصدار "اللحظة" هو "2.10.2"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.match(packJson.dependencies.moment, /^[\^\~]?2\.10\.2/, ''Wrong version of "moment". It should be 2.10.2''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 587d7fb5367417b2b2512c04
|
||||
title: Remove a Package from Your Dependencies
|
||||
localeTitle: قم بإزالة حزمة من التبعيات الخاصة بك
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
لقد قمت الآن باختبار بعض الطرق التي يمكنك من خلالها إدارة تبعيات مشروعك باستخدام قسم تبعيات package.json. لقد قمت بتضمين الحزم الخارجية عن طريق إضافتها إلى الملف وحتى إخبار npm بأنواع الإصدارات التي تريدها باستخدام أحرف خاصة مثل tilde (~) أو علامة الإقحام (^).
|
||||
ولكن ماذا لو كنت ترغب في إزالة حزمة خارجية لم تعد بحاجة إليها؟ كنت قد خمنت بالفعل - فقط إزالة "مفتاح" المقابلة: الزوج قيمة لذلك من الاعتماديات الخاصة بك.
|
||||
تنطبق هذه الطريقة نفسها على إزالة الحقول الأخرى في الحزمة الخاصة بك. json بالإضافة إلى
|
||||
تعليمات
|
||||
إزالة لحظة الحزمة من التبعيات الخاصة بك.
|
||||
تأكد من حصولك على كمية مناسبة من الفواصل بعد إزالتها.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب ألا تتضمن "التبعيات" "لحظة"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.notProperty(packJson.dependencies, ''moment'', ''"dependencies" still includes "moment"''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,49 @@
|
||||
---
|
||||
id: 587d7fb5367417b2b2512c03
|
||||
title: Use the Caret-Character to Use the Latest Minor Version of a Dependency
|
||||
localeTitle: استخدم حرف الإقحام لاستخدام أحدث إصدار ثانوي من التبعية
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
شبيه بالكيفية التي سمعت بها التلدة (~) التي تعلمناها في التحدي الأخير لـ npm لتثبيت أحدث PATCH للتبعية ، تسمح علامة الإقحام (^) لـ npm لتثبيت التحديثات المستقبلية أيضًا. الفرق هو أن حرف الإقحام سيسمح بتحديثات MINOR و PATCHes.
|
||||
في الوقت الحالي ، يجب أن يكون الإصدار الحالي من اللحظة ~ 2.10.2 والذي يسمح لـ npm بالتثبيت على أحدث إصدار 2.10.x. إذا استخدمنا بدلاً من ذلك علامة الإقحام (^) كبادئة للإصدار ، فسيتم السماح لـ npm بالتحديث إلى أي إصدار 2.xx.
|
||||
مثال
|
||||
<code>"some-package-name": "^1.3.8" allows updates to any 1.xx version.</code>
|
||||
تعليمات
|
||||
استخدم حرف الإقحام (^) لبدء إصدار اللحظة في تبعياتك والسماح لـ npm بتحديثه إلى أي إصدار جديد صغير.
|
||||
لاحظ أنه لا يجب تغيير أرقام الإصدارات نفسها.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تتضمن "التبعيات" "لحظة"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.property(packJson.dependencies, ''moment'', ''"dependencies" does not include "moment"''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن يتطابق إصدار "اللحظة" مع "^ 2.x.x"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.match(packJson.dependencies.moment, /^\^2\./, ''Wrong version of "moment". It should be ^2.10.2''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,49 @@
|
||||
---
|
||||
id: 587d7fb5367417b2b2512c02
|
||||
title: Use the Tilde-Character to Always Use the Latest Patch Version of a Dependency
|
||||
localeTitle: استخدم حرف التلدة إلى استخدام أحدث إصدار تصحيح من تبعية
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
في التحدي الأخير ، أخبرنا npm بتضمين إصدار محدد فقط من الحزمة. هذه طريقة مفيدة لتجميد تبعياتك إذا كنت بحاجة إلى التأكد من أن الأجزاء المختلفة من مشروعك تبقى متوافقة مع بعضها البعض. ولكن في معظم حالات الاستخدام ، لا تريد أن تفوتك أي إصلاحات للأخطاء ، نظرًا لأنها غالبًا ما تتضمن تصحيحات أمنية مهمة (ورجاءً) ألا تكسر الأشياء في القيام بذلك.
|
||||
للسماح بتبعية npm ليتم تحديثها إلى أحدث إصدار PATCH ، يمكنك بادئة إصدار التبعية بحرف التلدة (~). في package.json ، فإن القاعدة الحالية التي نتبعها حول كيفية قيام npm بترقية اللحظة هي استخدام إصدار محدد فقط (2.10.2) ، ولكننا نريد السماح بأحدث إصدار 2.10.x.
|
||||
مثال
|
||||
<code>"some-package-name": "~1.3.8" allows updates to any 1.3.x version.</code>
|
||||
إرشادات
|
||||
استخدم حرف التلدة (~) لبدء إصدار اللحظة في تبعياتك والسماح لـ npm بتحديثه إلى أي إصدار PATCH جديد.
|
||||
لاحظ أنه لا يجب تغيير أرقام الإصدارات نفسها.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تتضمن "التبعيات" "لحظة"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.property(packJson.dependencies, ''moment'', ''"dependencies" does not include "moment"''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن يتطابق إصدار "اللحظة" "~ 2.10.2"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/package.json'').then(data => { var packJson = JSON.parse(data); assert.match(packJson.dependencies.moment, /^\~2\.10\.2/, ''Wrong version of "moment". It should be ~2.10.2''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 587d7fb9367417b2b2512c12
|
||||
title: Chain Search Query Helpers to Narrow Search Results
|
||||
localeTitle: سلسلة بحث مساعدة المساعدين لضيق نتائج البحث
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
إذا لم تقم بتمرير معاودة الاتصال كالوسيطة الأخيرة إلى Model.find () (أو إلى طرق البحث الأخرى) ، فلن يتم تنفيذ الاستعلام. يمكنك تخزين الاستعلام في متغير للاستخدام في وقت لاحق. يمكّنك هذا النوع من الكائنات من إنشاء استعلام باستخدام بناء جملة تسلسل. يتم تنفيذ البحث الفعلي db عندما تقوم بسلسلة الأسلوب .exec () أخيراً. تمرير رد الاتصال الخاص بك لهذه الطريقة الأخيرة. هناك العديد من مساعدي الاستعلام ، هنا سنستخدم الأكثر شيوعًا.
|
||||
العثور على الناس الذين يحبون "بوريتو". وفرزها حسب الاسم ، وحصر النتائج في مستندين ، وإخفاء عمرهم. سلسلة .find () ، .sort () ، .limit () ، .select () ، ثم .exec (). تمرير الاستدعاء (err، data) المنفذة exec ().
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تنجح مساعدين الاستعلام تسلسل
|
||||
testString: 'getUserInput => $.ajax({url: getUserInput(''url'') + ''/_api/query-tools'', type: ''POST'', contentType:''application/json'', data: JSON.stringify([{name: ''Pablo'', age: 26, favoriteFoods: [''burrito'', ''hot-dog'']}, {name: ''Bob'', age: 23, favoriteFoods: [''pizza'', ''nachos'']}, {name: ''Ashley'', age: 32, favoriteFoods: [''steak'', ''burrito'']}, {name: ''Mario'', age: 51, favoriteFoods: [''burrito'', ''prosciutto'']} ]) }).then(data => { assert.isArray(data, ''the response should be an Array''); assert.equal(data.length, 2, ''the data array length is not what expected''); assert.notProperty(data[0], ''age'', ''The returned first item has too many properties''); assert.equal(data[0].name, ''Ashley'', ''The returned first item name is not what expected''); assert.notProperty(data[1], ''age'', ''The returned second item has too many properties''); assert.equal(data[1].name, ''Mario'', ''The returned second item name is not what expected'');}, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,61 @@
|
||||
---
|
||||
id: 587d7fb6367417b2b2512c07
|
||||
title: Create a Model
|
||||
localeTitle: خلق نموذج
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
أولا وقبل كل ما نحتاج إليه في المخطط. كل مخطط مخططات إلى مجموعة MongoDB. يحدد شكل المستندات داخل هذه المجموعة.
|
||||
المخططات هي العنصر الأساسي للنماذج. يمكن أن تكون متداخلة لإنشاء نماذج معقدة ، ولكن في هذه الحالة سنبقي الأمور بسيطة.
|
||||
يتيح لك نموذج إنشاء مثيلات لكائنات ، تسمى مستندات.
|
||||
إنشاء شخص لديه هذا النموذج الأولي:
|
||||
<code>- Person Prototype -</code>
|
||||
<code>--------------------</code>
|
||||
<code>name : string [required]</code>
|
||||
<code>age : number</code>
|
||||
<code>favoriteFoods : array of strings (*)</code>
|
||||
استخدم أنواع المخطط الأساسي للنمس. إذا أردت يمكنك أيضا إضافة
|
||||
حقول أكثر من ذلك، استخدام المصادقون بسيطة مثل المطلوبة أو فريدة من نوعها،
|
||||
القيم الافتراضية والمحددة. انظر <a href='http://mongoosejs.com/docs/guide.html'>مستندات النمس</a> .
|
||||
[C] RUD الجزء الأول - CREATE
|
||||
ملاحظة: خلل هو خادم حقيقي ، والخوادم الحقيقية في التفاعلات مع ديسيبل يحدث في وظائف معالج. يتم تنفيذ هذه الوظيفة عند حدوث بعض الأحداث (على سبيل المثال ، يضرب أحد الأشخاص نقطة نهاية على واجهة برمجة التطبيقات). سنتبع نفس النهج في هذه التمارين. الدالة done () هي رد اتصال يخبرنا أنه يمكننا المتابعة بعد إكمال عملية غير متزامنة مثل الإدراج أو البحث أو التحديث أو الحذف. إنه يتبع اصطلاح "عقدة" ويجب أن يتم استدعاؤه كـ "فارغ (بيانات) فارغة" أو "تم" (خطأ) على الخطأ.
|
||||
تحذير - عند التفاعل مع الخدمات عن بعد ، قد تحدث أخطاء!
|
||||
<code>/* Example */</code>
|
||||
<code>var someFunc = function(done) {</code>
|
||||
<code>//... do something (risky) ...</code>
|
||||
<code>if(error) return done(error);</code>
|
||||
<code>done(null, result);</code>
|
||||
<code>};</code>
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن ينجح إنشاء مثيل من مخطط النمس
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/_api/mongoose-model'', {name: ''Mike'', age: 28, favoriteFoods: [''pizza'', ''cheese'']}).then(data => { assert.equal(data.name, ''Mike'', ''"model.name" is not what expected''); assert.equal(data.age, ''28'', ''"model.age" is not what expected''); assert.isArray(data.favoriteFoods, ''"model.favoriteFoods" is not an Array''); assert.include(data.favoriteFoods, ''pizza'', ''"model.favoriteFoods" does not include the expected items''); assert.include(data.favoriteFoods, ''cheese'', ''"model.favoriteFoods" does not include the expected items''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,46 @@
|
||||
---
|
||||
id: 587d7fb6367417b2b2512c09
|
||||
title: Create and Save a Record of a Model
|
||||
localeTitle: إنشاء وحفظ سجل للنموذج
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
إنشاء نسخة من المستند باستخدام مُنشئ الشخص الذي قمت بإنشائه من قبل. تمرير إلى المنشئ كائن له اسم الحقول والعمر و foodFoods المفضلة. يجب أن تكون أنواعها متوافقة مع تلك الموجودة في "مخطط الشخص". ثم استدعاء الأسلوب document.save () على مثيل المستند الذي تم إرجاعه. تمرير إليه رد اتصال باستخدام عقدة العقد. هذا نمط شائع ، كل طرق CRUD التالية تأخذ وظيفة رد اتصال مثل هذا كوسيطة أخيرة.
|
||||
<code>/* Example */</code>
|
||||
<code>// ...</code>
|
||||
<code>person.save(function(err, data) {</code>
|
||||
<code>// ...do your stuff here...</code>
|
||||
<code>});</code>
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن ينجح إنشاء عنصر db وحفظه
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/create-and-save-person'').then(data => { assert.isString(data.name, ''"item.name" should be a String''); assert.isNumber(data.age, ''28'', ''"item.age" should be a Number''); assert.isArray(data.favoriteFoods, ''"item.favoriteFoods" should be an Array''); assert.equal(data.__v, 0, ''The db item should be not previously edited''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,41 @@
|
||||
---
|
||||
id: 587d7fb7367417b2b2512c0a
|
||||
title: Create Many Records with model.create()
|
||||
localeTitle: إنشاء العديد من السجلات باستخدام model.create ()
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
بعض الأحيان تحتاج إلى إنشاء العديد من الأمثلة من النماذج الخاصة بك ، على سبيل المثال عند إنشاء قاعدة بيانات بالبيانات الأولية. تأخذ مجموعة Model.create () مصفوفة من الكائنات مثل [{name: 'John'، ...}، {...}، ...] باعتبارها أول وسيطة ، وحفظها كلها في db. قم بإنشاء العديد من الأشخاص باستخدام Model.create () ، باستخدام الدالة arrayOfPeople.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن ينجح إنشاء العديد من عناصر db في وقت واحد
|
||||
testString: 'getUserInput => $.ajax({url: getUserInput(''url'') + ''/_api/create-many-people'', type: ''POST'', contentType:''application/json'', data: JSON.stringify([{name: ''John'', age: 24, favoriteFoods: [''pizza'', ''salad'']}, {name: ''Mary'', age: 21, favoriteFoods: [''onions'', ''chicken'']}])}).then(data => { assert.isArray(data, ''the response should be an array''); assert.equal(data.length, 2, ''the response does not contain the expected number of items''); assert.equal(data[0].name, ''John'', ''The first item is not correct''); assert.equal(data[0].__v, 0, ''The first item should be not previously edited''); assert.equal(data[1].name, ''Mary'', ''The second item is not correct''); assert.equal(data[1].__v, 0, ''The second item should be not previously edited''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 587d7fb8367417b2b2512c11
|
||||
title: Delete Many Documents with model.remove()
|
||||
localeTitle: حذف العديد من المستندات باستخدام model.remove ()
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
Model.remove () مفيد لحذف جميع الوثائق التي تطابق معايير محددة. احذف جميع الأشخاص الذين يكون اسمهم "Mary" ، باستخدام Model.remove (). قم بنقله إلى مستند استعلام باستخدام مجموعة حقول "الاسم" ، وبالطبع رد اتصال.
|
||||
ملاحظة: لا يقوم Model.remove () بإرجاع المستند المحذوف ، ولكن كائن JSON يحتوي على نتيجة العملية وعدد العناصر المتأثرة. لا تنسَ تمريرها إلى معاودة الاتصال () ، لأننا نستخدمها في الاختبارات.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن ينجح حذف العديد من العناصر في وقت واحد
|
||||
testString: 'getUserInput => $.ajax({url: getUserInput(''url'') + ''/_api/remove-many-people'', type: ''POST'', contentType:''application/json'', data: JSON.stringify([{name: ''Mary'', age: 16, favoriteFoods: [''lollipop'']}, {name: ''Mary'', age: 21, favoriteFoods: [''steak'']}])}).then(data => { assert.isTrue(!!data.ok, ''The mongo stats are not what expected''); assert.equal(data.n, 2, ''The number of items affected is not what expected''); assert.equal(data.count, 0, ''the db items count is not what expected''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,41 @@
|
||||
---
|
||||
id: 587d7fb8367417b2b2512c10
|
||||
title: Delete One Document Using model.findByIdAndRemove
|
||||
localeTitle: حذف مستند واحد باستخدام model.findByIdAndRemove
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
احذف شخصًا واحدًا من _id. يجب استخدام أحد الأساليب findByIdAndRemove () أو findOneAndRemove (). هم مثل أساليب التحديث السابقة. يمرر المستند الذي تمت إزالته إلى cb. كالعادة ، استخدم الدالة argument personId كمفتاح بحث.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن ينجح حذف عنصر
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/_api/remove-one-person'', {name:''Jason Bourne'', age: 36, favoriteFoods:[''apples'']}).then(data => { assert.equal(data.name, ''Jason Bourne'', ''item.name is not what expected''); assert.equal(data.age, 36, ''item.age is not what expected''); assert.deepEqual(data.favoriteFoods, [''apples''], ''item.favoriteFoods is not what expected''); assert.equal(data.__v, 0); assert.equal(data.count, 0, ''the db items count is not what expected''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,45 @@
|
||||
---
|
||||
id: 587d7fb6367417b2b2512c06
|
||||
title: Install and Set Up Mongoose
|
||||
localeTitle: تثبيت وإعداد النمس
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
إضافة mongodb والنمس إلى package.json المشروع. ثم تتطلب النمس. قم بتخزين URI قاعدة بيانات قاعدة البيانات الخاصة بك في ملف .env الخاص كـ MONGO_URI. الاتصال بقاعدة البيانات باستخدام mongoose.connect ( <Your URI> )
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: يجب أن تكون "" mongodb "التبعية في package.json"
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/file/package.json'').then(data => { var packJson = JSON.parse(data); assert.property(packJson.dependencies, ''mongodb''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب أن يكون التبعية "النمس" في package.json "
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/file/package.json'').then(data => { var packJson = JSON.parse(data); assert.property(packJson.dependencies, ''mongoose''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
- text: يجب ربط "النمس" بقاعدة بيانات "
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/is-mongoose-ok'').then(data => {assert.isTrue(data.isMongooseOk, ''mongoose is not connected'')}, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,43 @@
|
||||
---
|
||||
id: 587d7fb8367417b2b2512c0e
|
||||
title: 'Perform Classic Updates by Running Find, Edit, then Save'
|
||||
localeTitle: "قم بإجراء التحديثات الكلاسيكية عن طريق تشغيل بحث ، تحرير ، ثم حفظ"
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
في الأيام الخوالي ، كان هذا هو ما تحتاج إلى القيام به إذا كنت ترغب في تحرير مستند وتكون قادرًا على استخدامه بطريقة ما ، على سبيل المثال إرساله مرة أخرى في استجابة الخادم. لدى Mongoose طريقة تحديث مخصصة: Model.update (). يتم ربطه بالسائق المنخفض المستوى من طراز mongo. يمكنه تحرير الكثير من الوثائق التي تتطابق مع معايير معينة ، لكنه لا يرسل الوثيقة المحدثة ، فقط رسالة "الحالة". وعلاوة على ذلك ، فإنه يجعل عمليات التحقق من صحة النموذج صعبة ، لأنه فقط يدعو مباشرة سائق المونجو.
|
||||
البحث عن شخص بواسطة _id (استخدام أي من الأساليب المذكورة أعلاه) مع person المعلمة كمفتاح البحث. أضف "الهامبرغر" إلى قائمة منتجاتها المفضلة (يمكنك استخدام Array.push ()). ثم - داخل البحث عن معاودة الاتصال - حفظ () الشخص المحدثة.
|
||||
[*] تلميح: قد يكون هذا أمرًا صعبًا إذا كنت قد أعلنت في المخطط الخاص بك أن الأطعمة المفضلة هي صفيف ، دون تحديد النوع (أي [السلسلة]). في ذلك casefavorite السلع الافتراضية إلى نوع مختلط ، ويجب عليك وضع علامة عليه يدويًا كما تم تحريره باستخدام document.markModified ('edited-field'). (http://mongoosejs.com/docs/schematypes.html - # مختلط)
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: البحث عن تحرير عنصر يجب أن تنجح
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/_api/find-edit-save'', {name:''Poldo'', age: 40, favoriteFoods:[''spaghetti'']}).then(data => { assert.equal(data.name, ''Poldo'', ''item.name is not what expected''); assert.equal(data.age, 40, ''item.age is not what expected''); assert.deepEqual(data.favoriteFoods, [''spaghetti'', ''hamburger''], ''item.favoriteFoods is not what expected''); assert.equal(data.__v, 1, ''The item should be previously edited''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,43 @@
|
||||
---
|
||||
id: 587d7fb8367417b2b2512c0f
|
||||
title: Perform New Updates on a Document Using model.findOneAndUpdate()
|
||||
localeTitle: إجراء تحديثات جديدة على مستند باستخدام model.findOneAndUpdate ()
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
الإصدارات الحديثة من النمس لها طرق لتبسيط تحديث الوثائق. تتصرف بعض الميزات الأكثر تقدمًا (أي خطافات ما قبل / النشر والتحقق من الصحة) بشكل مختلف مع هذا الأسلوب ، لذلك لا تزال الطريقة الكلاسيكية مفيدة في العديد من المواقف. يمكن استخدام findByIdAndUpdate () عند البحث باستخدام Id.
|
||||
البحث عن شخص حسب الاسم وتعيين سنها إلى 20. استخدم الدالة parameter nameName كمفتاح بحث.
|
||||
تلميح: نريد منك إرجاع المستند الذي تم تحديثه. للقيام بذلك ، تحتاج إلى تمرير مستند الخيارات {جديد: true} كوسيطة 3 للبحث عن OneOndUpdate (). بشكل افتراضي ، ترجع هذه الطرق الكائن غير المعدل.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: findOneAndUpdate يجب أن ينجح عنصر
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/_api/find-one-update'', {name:''Dorian Gray'', age: 35, favoriteFoods:[''unknown'']}).then(data => { assert.equal(data.name, ''Dorian Gray'', ''item.name is not what expected''); assert.equal(data.age, 20, ''item.age is not what expected''); assert.deepEqual(data.favoriteFoods, [''unknown''], ''item.favoriteFoods is not what expected''); assert.equal(data.__v, 0, ''findOneAndUpdate does not increment version by design !!!''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 587d7fb7367417b2b2512c0b
|
||||
title: Use model.find() to Search Your Database
|
||||
localeTitle: استخدم model.find () للبحث في قاعدة البيانات الخاصة بك
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
البحث عن جميع الأشخاص الذين لديهم اسم معين ، باستخدام Model.find () -> [شخص]
|
||||
في أبسط استخدام له ، يقبل Model.find () مستند استعلام (كائن JSON) كالوسيطة الأولى ، ثم رد اتصال. تقوم بإرجاع مجموعة من التطابقات. وهو يدعم مجموعة واسعة للغاية من خيارات البحث. التحقق من ذلك في المستندات. استخدم الوسيطة function personName كمفتاح البحث.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: البحث عن العناصر المقابلة لمعايير يجب أن تنجح
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/_api/find-all-by-name'', {name: ''r@nd0mN4m3'', age: 24, favoriteFoods: [''pizza'']}).then(data => { assert.isArray(data, ''the response should be an Array''); assert.equal(data[0].name, ''r@nd0mN4m3'', ''item.name is not what expected''); assert.equal(data[0].__v, 0, ''The item should be not previously edited''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,41 @@
|
||||
---
|
||||
id: 587d7fb7367417b2b2512c0d
|
||||
title: Use model.findById() to Search Your Database By _id
|
||||
localeTitle: استخدم model.findById () للبحث في قاعدة البيانات الخاصة بك بواسطة _id
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
عند حفظ مستند ، يقوم mongodb تلقائيًا بإضافة حقل _id ، وتعيينه إلى مفتاح أبجدي رقمي فريد. البحث عن طريق _id هو عملية متكررة للغاية ، لذلك يوفر النمس طريقة مخصصة لذلك. ابحث عن الشخص (فقط !!) الذي لديه _id محدد ، باستخدام Model.findById () -> الشخص. استخدم الوسيطة function personId كمفتاح البحث.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: العثور على عنصر من خلال معرف يجب أن تنجح
|
||||
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/_api/find-by-id'').then(data => { assert.equal(data.name, ''test'', ''item.name is not what expected''); assert.equal(data.age, 0, ''item.age is not what expected''); assert.deepEqual(data.favoriteFoods, [''none''], ''item.favoriteFoods is not what expected''); assert.equal(data.__v, 0, ''The item should be not previously edited''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
@ -0,0 +1,41 @@
|
||||
---
|
||||
id: 587d7fb7367417b2b2512c0c
|
||||
title: Use model.findOne() to Return a Single Matching Document from Your Database
|
||||
localeTitle: استخدم model.findOne () لإرجاع مستند مطابقة مفردة من قاعدة البيانات الخاصة بك
|
||||
challengeType: 2
|
||||
---
|
||||
|
||||
## Description
|
||||
<section id='description'>
|
||||
يتصرف model.findOne () مثل .find () ، ولكنه يقوم بإرجاع مستند واحد فقط (وليس صفيف) ، حتى إذا كان هناك عدة عناصر. من المفيد بشكل خاص عند البحث عن طريق الخصائص التي أعلنت أنها فريدة من نوعها. البحث عن شخص واحد فقط لديه طعام معين في المفضلة لها ، وذلك باستخدام Model.findOne () -> شخص. استخدم الوسيطة الدالة الغذائية كمفتاح بحث.
|
||||
</section>
|
||||
|
||||
## Instructions
|
||||
<section id='instructions'>
|
||||
|
||||
</section>
|
||||
|
||||
## Tests
|
||||
<section id='tests'>
|
||||
|
||||
```yml
|
||||
tests:
|
||||
- text: العثور على عنصر واحد يجب أن تنجح
|
||||
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/_api/find-one-by-food'', {name: ''Gary'', age: 46, favoriteFoods: [''chicken salad'']}).then(data => { assert.equal(data.name, ''Gary'', ''item.name is not what expected''); assert.deepEqual(data.favoriteFoods, [''chicken salad''], ''item.favoriteFoods is not what expected''); assert.equal(data.__v, 0, ''The item should be not previously edited''); }, xhr => { throw new Error(xhr.responseText); })'
|
||||
|
||||
```
|
||||
|
||||
</section>
|
||||
|
||||
## Challenge Seed
|
||||
<section id='challengeSeed'>
|
||||
|
||||
</section>
|
||||
|
||||
## Solution
|
||||
<section id='solution'>
|
||||
|
||||
```js
|
||||
// solution required
|
||||
```
|
||||
</section>
|
Reference in New Issue
Block a user