fix: add Api challenges - Russian

This commit is contained in:
Beau Carnes
2019-02-11 16:57:05 -05:00
committed by Kristofer Koishigawa
parent f868294515
commit 24a9bb98ac
39 changed files with 1810 additions and 0 deletions

View File

@ -0,0 +1,52 @@
---
id: 5a8b073d06fa14fcfde687aa
title: Exercise Tracker
localeTitle: Трекер упражнений
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Создайте полноценное приложение JavaScript, функционально похожее на это: <a href='https://fuschia-custard.glitch.me/' target='_blank'>https://fuschia-custard.glitch.me/</a> .
Работа над этим проектом потребует от вас написания кода на Glitch для нашего стартового проекта. После завершения этого проекта вы можете скопировать общедоступный URL-адрес сбоя (на главную страницу вашего приложения) на этот экран, чтобы протестировать его! При желании вы можете написать свой проект на другой платформе, но он должен быть открыт для нашего тестирования.
Запустите этот проект на Glitch по <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! Если вы используете Glitch, не забудьте сохранить ссылку на ваш проект в безопасном месте!
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Я могу создать пользователя, разместив имя пользователя с данными формы в / api / exerc / new-user, и возвращаемым будет объект с именем пользователя и <code>_id</code> .
testString: ''
- text: Я могу получить массив всех пользователей, получив API / упражнения / пользователей с той же информацией, что и при создании пользователя.
testString: ''
- text: «Я могу добавить упражнение любому пользователю, опубликовав данные формы userId (_id), описание, продолжительность и, необязательно, дату в / api / упражнение / добавить. Если дата не указана, будет использоваться текущая дата. Приложение вернет объект пользователя с добавленными полями упражнений. '
testString: ''
- text: Я могу получить полный журнал упражнений любого пользователя, получив / api / exerc / log с параметром userId (_id). Приложение вернет объект пользователя с добавленным массивом журнала и счетчиком (общее количество упражнений).
testString: ''
- text: «Я могу получить часть журнала любого пользователя, также передавая необязательные параметры от и до или ограничения. (Формат даты гггг-мм-дд, предел = int) '
testString: ''
```
</section>
## Challenge Seed
<section id='challengeSeed'>
</section>
## Solution
<section id='solution'>
```js
// solution required
```
</section>

View File

@ -0,0 +1,46 @@
---
id: bd7158d8c443edefaeb5bd0f
title: File Metadata Microservice
localeTitle: Файловые метаданные Микросервис
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Создайте полноценное приложение JavaScript, функционально похожее на это: <a href='https://purple-paladin.glitch.me/' target='_blank'>https://purple-paladin.glitch.me/</a> .
Работа над этим проектом потребует от вас написания кода на Glitch для нашего стартового проекта. После завершения этого проекта вы можете скопировать общедоступный URL-адрес сбоя (на главную страницу вашего приложения) на этот экран, чтобы протестировать его! При желании вы можете написать свой проект на другой платформе, но он должен быть открыт для нашего тестирования.
Запустите этот проект на Glitch по <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! Если вы используете Glitch, не забудьте сохранить ссылку на ваш проект в безопасном месте!
</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>

View File

@ -0,0 +1,44 @@
---
id: bd7158d8c443edefaeb5bdff
title: Request Header Parser Microservice
localeTitle: Запросить заголовок Parser Microservice
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Создайте полноценное приложение JavaScript, функционально похожее на это: <a href='https://dandelion-roar.glitch.me/' target='_blank'>https://dandelion-roar.glitch.me/</a> .
Работа над этим проектом потребует от вас написания кода на Glitch для нашего стартового проекта. После завершения этого проекта вы можете скопировать общедоступный URL-адрес сбоя (на главную страницу вашего приложения) на этот экран, чтобы протестировать его! При желании вы можете написать свой проект на другой платформе, но он должен быть открыт для нашего тестирования.
Запустите этот проект на Glitch по <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! Если вы используете Glitch, не забудьте сохранить ссылку на ваш проект в безопасном месте!
</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>

View File

@ -0,0 +1,54 @@
---
id: bd7158d8c443edefaeb5bdef
title: Timestamp Microservice
localeTitle: Временная метка Микросервис
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Создайте полноценное приложение JavaScript, функционально похожее на это: <a href='https://curse-arrow.glitch.me/' target='_blank'>https://curse-arrow.glitch.me/</a> .
Работа над этим проектом потребует от вас написания кода на Glitch для нашего стартового проекта. После завершения этого проекта вы можете скопировать общедоступный URL-адрес сбоя (на главную страницу вашего приложения) на этот экран, чтобы протестировать его! При желании вы можете написать свой проект на другой платформе, но он должен быть открыт для нашего тестирования.
Запустите этот проект на Glitch по <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! Если вы используете Glitch, не забудьте сохранить ссылку на ваш проект в безопасном месте!
</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>

View File

@ -0,0 +1,48 @@
---
id: bd7158d8c443edefaeb5bd0e
title: URL Shortener Microservice
localeTitle: URL Шортенер Микросервис
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Создайте полноценное приложение JavaScript, функционально похожее на это: <a href='https://thread-paper.glitch.me/' target='_blank'>https://thread-paper.glitch.me/</a> .
Работа над этим проектом потребует от вас написания кода на Glitch для нашего стартового проекта. После завершения этого проекта вы можете скопировать общедоступный URL-адрес сбоя (на главную страницу вашего приложения) на этот экран, чтобы протестировать его! При желании вы можете написать свой проект на другой платформе, но он должен быть открыт для нашего тестирования.
Запустите этот проект на Glitch по <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! Если вы используете Glitch, не забудьте сохранить ссылку на ваш проект в безопасном месте!
</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>

View File

@ -0,0 +1,48 @@
---
id: 587d7fb1367417b2b2512bf4
title: Chain Middleware to Create a Time Server
localeTitle: Промежуточное ПО для создания сервера времени
challengeType: 2
---
## Description
<section id='description'>
<code>app.METHOD(path, middlewareFunction)</code> можно смонтировать по определенному маршруту, используя <code>app.METHOD(path, middlewareFunction)</code> . Промежуточное программное обеспечение также может быть связано внутри определения маршрута.
Посмотрите на следующий пример:
<blockquote>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>
Этот подход полезен для разделения операций сервера на более мелкие единицы. Это приводит к лучшей структуре приложения и возможности повторного использования кода в разных местах. Этот подход также можно использовать для проверки данных. В каждой точке стека промежуточного программного обеспечения вы можете заблокировать выполнение текущей цепочки и передать управление функциям, специально разработанным для обработки ошибок. Или вы можете передать управление следующему подходящему маршруту для обработки особых случаев. Мы увидим, как в расширенном разделе Экспресс.
В маршруте <code>app.get('/now', ...)</code> функцию промежуточного программного обеспечения и конечный обработчик. В функции промежуточного программного обеспечения вы должны добавить текущее время к объекту запроса в ключе <code>req.time</code> . Вы можете использовать <code>new Date().toString()</code> . В обработчике ответьте объектом JSON, взяв структуру <code>{time: req.time}</code> .
Подсказка: тест не пройдет, если вы не подключите промежуточное ПО. Если вы смонтируете функцию где-то еще, тест не пройдёт, даже если результат вывода верный.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Конечная точка / now должна иметь смонтированное промежуточное ПО
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: Конечная точка / now должна возвращать время +/- 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>

View File

@ -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 (Строка запроса). Если body-parser настроен правильно, вы должны найти параметры в объекте <code>req.body</code> . Посмотрите на обычный пример библиотеки:
<blockquote>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 =&gt; Удалить ресурс.
Есть также несколько других методов, которые используются для согласования соединения с сервером. За исключением GET, все другие методы, перечисленные выше, могут иметь полезную нагрузку (то есть данные в теле запроса). Промежуточное программное обеспечение body-parser также работает с этими методами.
</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>

View File

@ -0,0 +1,46 @@
---
id: 587d7fb2367417b2b2512bf6
title: Get Query Parameter Input from the Client
localeTitle: Получить ввод параметров запроса от клиента
challengeType: 2
---
## Description
<section id='description'>
Другим распространенным способом получения ввода от клиента является кодирование данных после пути маршрута с использованием строки запроса. Строка запроса ограничена знаком вопроса (?) И включает пары поле = значение. Каждая пара отделяется амперсандом (&amp;). Express может анализировать данные из строки запроса и заполнять объект <code>req.query</code> . Некоторые символы не могут быть в URL, они должны быть закодированы в <a href='https://en.wikipedia.org/wiki/Percent-encoding' target='_blank'>другом формате,</a> прежде чем вы сможете отправить их. Если вы используете API из JavaScript, вы можете использовать специальные методы для кодирования / декодирования этих символов.
<blockquote>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&amp;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>

View File

@ -0,0 +1,45 @@
---
id: 587d7fb2367417b2b2512bf5
title: Get Route Parameter Input from the Client
localeTitle: Получить ввод параметров маршрута от клиента
challengeType: 2
---
## Description
<section id='description'>
При создании API мы должны разрешать пользователям сообщать нам, что они хотят получить от нашего сервиса. Например, если клиент запрашивает информацию о пользователе, хранящемся в базе данных, ему нужен способ сообщить нам, какого пользователя он заинтересовал. Одним из возможных способов достижения этого результата является использование параметров маршрута. Параметры маршрута - это именованные сегменты URL, разделенные косой чертой (/). Каждый сегмент фиксирует значение той части URL, которая соответствует его позиции. Захваченные значения можно найти в объекте <code>req.params</code> .
<blockquote>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>

View File

@ -0,0 +1,47 @@
---
id: 587d7fb1367417b2b2512bf3
title: Implement a Root-Level Request Logger Middleware
localeTitle: Реализовать промежуточное программное обеспечение регистратора запросов корневого уровня
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>function(req, res, next) {<br> console.log("I'm a middleware...");<br> next();<br>}</blockquote>
Давайте предположим, что мы смонтировали эту функцию на маршруте. Когда запрос соответствует маршруту, он отображает строку «Я - промежуточное ПО…». Затем он выполняет следующую функцию в стеке.
В этом упражнении мы собираемся создать промежуточное программное обеспечение корневого уровня. Как мы видели в задаче 4, чтобы смонтировать функцию промежуточного программного обеспечения на корневом уровне, мы можем использовать метод <code>app.use(&lt;mware-function&gt;)</code> . В этом случае функция будет выполнена для всех запросов, но вы также можете установить более конкретные условия. Например, если вы хотите, чтобы функция выполнялась только для запросов POST, вы можете использовать <code>app.post(&lt;mware-function&gt;)</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> окружен пространством с обоего сторон. Вы можете получить метод запроса (http-глагол), относительный путь маршрута и IP-адрес вызывающего абонента из объекта запроса, используя <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: Промежуточное программное обеспечение Root Level Logger должно быть активным
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>

View File

@ -0,0 +1,42 @@
---
id: 587d7fb0367417b2b2512bed
title: Meet the Node console
localeTitle: Встречайте консоль Node
challengeType: 2
---
## Description
<section id='description'>
В процессе разработки важно иметь возможность проверить, что происходит в вашем коде. Node - это просто среда JavaScript. Как и клиентский JavaScript, вы можете использовать консоль для отображения полезной отладочной информации. На вашем локальном компьютере вы увидите вывод консоли в терминале. На Glitch вы можете открыть логи в нижней части экрана. Вы можете переключать панель журнала с помощью кнопки «Журналы» (вверху слева под названием приложения).
Для начала просто распечатай классический «Hello World» в консоли. Мы рекомендуем держать панель журнала открытой во время работы с этими проблемами. Читая журналы, вы можете знать природу возможных ошибок.
</section>
## Instructions
<section id='instructions'>
Измените файл <code>myApp.js</code> чтобы <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>

View File

@ -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> . За кулисами этот метод установит соответствующие заголовки, чтобы инструктировать ваш браузер о том, как обрабатывать файл, который вы хотите отправить, в соответствии с его типом. Затем он прочитает и отправит файл. Этот метод требует абсолютного пути к файлу. Мы рекомендуем вам использовать глобальную переменную Node <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: Ваше приложение должно обслуживать файл views / 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>

View File

@ -0,0 +1,43 @@
---
id: 587d7fb1367417b2b2512bf1
title: Serve JSON on a Specific Route
localeTitle: Служить JSON по определенному маршруту
challengeType: 2
---
## Description
<section id='description'>
Пока сервер HTML обслуживает (как вы уже догадались!) HTML, API обслуживает данные. <dfn>API REST</dfn> (REpresentational State Transfer) позволяет осуществлять простой обмен данными без необходимости для клиентов знать какие-либо подробности о сервере. Клиенту нужно только знать, где находится ресурс (URL) и какое действие он хочет с ним выполнить (глагол). Глагол GET используется, когда вы извлекаете некоторую информацию, ничего не изменяя. В наши дни предпочтительным форматом данных для перемещения информации по сети является JSON. Проще говоря, JSON - это удобный способ представления объекта JavaScript в виде строки, чтобы его можно было легко передавать.
Давайте создадим простой API, создав маршрут, который отвечает JSON по пути <code>/json</code> . Вы можете сделать это, как обычно, с помощью <code>app.get()</code> . Внутри обработчика маршрута используйте метод <code>res.json()</code> , передавая объект в качестве аргумента. Этот метод закрывает цикл запрос-ответ, возвращая данные. За кулисами он преобразует действительный объект JavaScript в строку, затем устанавливает соответствующие заголовки, чтобы сообщить браузеру, что вы обслуживаете JSON, и отправляет данные обратно. Допустимый объект имеет обычную структуру <code>{key: data}</code> . Данные могут содержать число, строку, вложенный объект или массив. Данные также могут быть переменной или результатом вызова функции; в этом случае он будет оценен перед преобразованием в строку.
Подайте объект <code>{"message": "Hello json"}</code> как ответ в формате JSON на запросы GET к маршруту <code>/json</code> . Затем укажите ваш браузер на ваш-app-url / 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>

View File

@ -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>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>

View File

@ -0,0 +1,46 @@
---
id: 587d7fb0367417b2b2512bee
title: Start a Working Express Server
localeTitle: Запустить работающий экспресс-сервер
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>function(req, res) {<br> res.send('Response String');<br>}</blockquote>
будет служить строкой «Response String».
Используйте метод <code>app.get()</code> для обслуживания строки Hello Express для получения запросов, соответствующих пути / root. Убедитесь, что ваш код работает, просматривая журналы, затем просмотрите результаты в своем браузере, нажав кнопку «Показать вживую» в пользовательском интерфейсе Glitch.
</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>

View File

@ -0,0 +1,48 @@
---
id: 587d7fb2367417b2b2512bf7
title: Use body-parser to Parse POST Requests
localeTitle: Используйте body-parser для разбора POST-запросов
challengeType: 2
---
## Description
<section id='description'>
Помимо GET есть еще один распространенный http глагол, это POST. POST - это метод по умолчанию, используемый для отправки данных клиента с помощью HTML-форм. В соглашении REST POST используется для отправки данных для создания новых элементов в базе данных (новый пользователь или новый пост в блоге). У нас нет базы данных в этом проекте, но мы все равно узнаем, как обрабатывать запросы POST.
В таких запросах данные не отображаются в URL, они скрыты в теле запроса. Это часть запроса HTML, также называемая полезной нагрузкой. Поскольку HTML основан на тексте, даже если вы не видите данные, это не значит, что они являются секретными. Необработанное содержимое запроса HTTP POST показано ниже:
<blockquote>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. Этот используется для загрузки бинарных файлов.
В этом упражнении мы будем использовать урлен-кодированное тело.
Для анализа данных, поступающих из запросов POST, вам необходимо установить пакет: body-parser. Этот пакет позволяет использовать серию промежуточного программного обеспечения, которое может декодировать данные в разных форматах. Смотрите документы <a href="https://github.com/expressjs/body-parser" target="_blank" >здесь</a> .
Установите модуль body-parser в ваш файл package.json. Тогда потребуйте это наверху файла. Сохраните его в переменной с именем bodyParser.
<code>bodyParser.urlencoded({extended: false})</code> программное обеспечение для обработки URL-кодированных данных возвращается <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>

View File

@ -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> является глобальным объектом Node, а переменные передаются в виде строк. По соглашению имена переменных должны быть в верхнем регистре, а слова разделены подчеркиванием. <code>.env</code> - это файл оболочки, поэтому вам не нужно <code>.env</code> в кавычки имена или значения. Также важно отметить, что не должно быть пробела вокруг знака равенства, когда вы присваиваете значения своим переменным, например, <code>VAR_NAME=value</code> . Обычно вы помещаете каждое определение переменной в отдельную строку.
Давайте добавим переменную окружения в качестве опции конфигурации. Сохраните переменную <code>MESSAGE_STYLE=uppercase</code> <code>.env</code> файле <code>.env</code> . Затем сообщите обработчику маршрута GET <code>/json</code> который вы создали в последнем вызове, чтобы преобразовать сообщение объекта ответа в верхний регистр, если <code>process.env.MESSAGE_STYLE</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>

View File

@ -0,0 +1,47 @@
---
id: 587d7fb3367417b2b2512bfc
title: Add a Description to Your package.json
localeTitle: Добавить описание к вашему package.json
challengeType: 2
---
## Description
<section id='description'>
Следующая часть хорошего package.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 должен иметь действительный ключ "description"
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>

View File

@ -0,0 +1,47 @@
---
id: 587d7fb4367417b2b2512bfe
title: Add a License to Your package.json
localeTitle: Добавить лицензию к вашему package.json
challengeType: 2
---
## Description
<section id='description'>
Поле лицензии - это место, где вы сообщаете пользователям вашего проекта, что им разрешено делать с ним.
Некоторые распространенные лицензии для проектов с открытым исходным кодом включают MIT и BSD. http://choosealicense.com - отличный ресурс, если вы хотите узнать больше о том, какая лицензия может соответствовать вашему проекту.
Информация о лицензии не требуется. Законы об авторском праве в большинстве стран предоставят вам право собственности на то, что вы создаете по умолчанию. Однако всегда полезно четко указывать, что пользователи могут и не могут делать.
Пример
<code>"license": "MIT",</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.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>

View File

@ -0,0 +1,45 @@
---
id: 587d7fb4367417b2b2512bff
title: Add a Version to Your package.json
localeTitle: Добавить версию в ваш package.json
challengeType: 2
---
## Description
<section id='description'>
Версия вместе с именем одного из обязательных полей в package.json. Это поле описывает текущую версию вашего проекта.
Пример
<code>"version": "1.2",</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.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>

View File

@ -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>
Как видите, это поле структурировано как массив строк в двойных кавычках.
Инструкции
Добавьте массив подходящих строк в поле ключевых слов в package.json вашего проекта Glitch.
Одно из ключевых слов должно быть freecodecamp.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: В package.json должен быть действительный ключ "keys"
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>

View File

@ -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 может точно знать, что нужно вашему проекту? Познакомьтесь с разделом зависимостей вашего package.json.
В разделе зависимостей пакеты, необходимые для вашего проекта, хранятся в следующем формате:
<code>"dependencies": {</code>
<code>"package-name": "version",</code>
<code>"express": "4.14.0"</code>
<code>}</code>
Инструкции
Добавьте версию 2.14.0 момента пакета в поле зависимостей вашего пакета. 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>

View File

@ -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, ядро любого проекта Node.js или пакет npm»
challengeType: 2
---
## Description
<section id='description'>
Файл package.json является центром любого проекта Node.js или пакета npm. Он хранит информацию о вашем проекте так же, как раздел &lt;head&gt; в HTML-документе описывает содержание веб-страницы. Пакет package.json состоит из одного JSON-объекта, в котором информация хранится в «ключе»: пары значений. В минимальном package.json есть только два обязательных поля - имя и версия - но рекомендуется предоставлять дополнительную информацию о вашем проекте, которая будет полезна для будущих пользователей или сопровождающих.
Поле автора
Если вы зайдете в проект Glitch, который вы настроили ранее, и посмотрите на левую сторону экрана, вы найдете дерево файлов, в котором вы можете увидеть обзор различных файлов в вашем проекте. Под внутренним разделом дерева файлов вы найдете package.json - файл, который мы будем улучшать в следующих двух задачах.
Одним из наиболее распространенных элементов информации в этом файле является поле автора, в котором указывается, кто является создателем проекта. Это может быть либо строка, либо объект с контактными данными. Объект рекомендуется для больших проектов, но в нашем случае подойдет простая строка, как в следующем примере.
<code>"author": "Jane Doe",</code>
Instructions
Добавьте свое имя в поле автора в файле package.json вашего проекта Glitch.
Помни, что ты пишешь JSON.
Все имена полей должны использовать двойные кавычки ("), например," author "
Все поля должны быть разделены запятой (,)
</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>

View File

@ -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 следуют так называемому семантическому версионированию (SemVer), отраслевому стандарту управления версиями программного обеспечения, целью которого является упрощение управления зависимостями. Библиотеки, фреймворки или другие инструменты, опубликованные на npm, должны использовать SemVer, чтобы четко определить, каких изменений ожидают проекты, зависящие от пакета, в случае их обновления.
SemVer не имеет смысла в проектах без общедоступных API - поэтому, если ваш проект не похож на приведенные выше примеры, используйте другой формат управления версиями.
Так зачем тебе понимать SemVer?
Знание SemVer может быть полезно при разработке программного обеспечения, которое использует внешние зависимости (что вы почти всегда делаете). Однажды, ваше понимание этих цифр избавит вас от случайного внесения критических изменений в ваш проект, не понимая, почему вещи, которые «сработали вчера», неожиданно не срабатывают.
Вот как Semantic Versioning работает в соответствии с официальным сайтом:
Учитывая номер версии MAJOR.MINOR.PATCH, увеличивайте версию:
MAJOR при внесении несовместимых изменений API, версию
MINOR при добавлении функциональности обратно-совместимым способом и
PATCH версия, когда вы делаете обратно совместимые исправления ошибок.
Это означает, что PATCH являются исправлениями ошибок, а MINOR добавляют новые функции, но ни одна из них не нарушает то, что работало раньше. Наконец, ОСНОВНЫЕ добавляют изменения, которые не будут работать с более ранними версиями.
Пример
Семантический номер версии: 1.3.8
Инструкции
В разделе зависимостей вашего package.json измените версию момента, чтобы она соответствовала ОСНОВНОЙ версии 2, МИНОР версии 10 и ПАТЧ версии 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>

View File

@ -0,0 +1,46 @@
---
id: 587d7fb5367417b2b2512c04
title: Remove a Package from Your Dependencies
localeTitle: Удалить пакет из ваших зависимостей
challengeType: 2
---
## Description
<section id='description'>
Теперь вы протестировали несколько способов управления зависимостями вашего проекта с помощью раздела package.json для зависимостей. Вы включили внешние пакеты, добавив их в файл, и даже сообщили npm, какие типы версий вам нужны, используя специальные символы в качестве тильды (~) или каретки (^).
Но что если ты хочешь удалить внешний пакет, который тебе больше не нужен? Возможно, вы уже догадались - просто удалите соответствующую пару «ключ»: значение для этого из ваших зависимостей.
Этот же метод применяется и к удалению других полей в вашем package.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>

View File

@ -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 устанавливать будущие обновления. Разница в том, что каретка будет разрешать как незначительные обновления, так и патчи.
На данный момент ваша текущая версия момента должна быть ~ 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 обновить ее до любой новой версии MINOR.
Обратите внимание, что сами номера версий менять не следует.
</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>

View File

@ -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>

View File

@ -0,0 +1,42 @@
---
id: 587d7fb9367417b2b2512c12
title: Chain Search Query Helpers to Narrow Search Results
localeTitle: Помощники поискового запроса цепочки сужают результаты поиска
challengeType: 2
---
## Description
<section id='description'>
Если вы не передадите обратный вызов в качестве последнего аргумента для Model.find () (или для других методов поиска), запрос не будет выполнен. Вы можете сохранить запрос в переменной для дальнейшего использования. Этот тип объекта позволяет создавать запрос с использованием синтаксиса цепочки. Фактический поиск в БД выполняется, когда вы, наконец, связываете метод .exec (). Передайте обратный вызов этому последнему методу. Есть много помощников запросов, здесь мы будем использовать самые «известные».
Найди людей которые любят «буррито». Сортируйте их по имени, ограничьте результаты двумя документами и скройте их возраст. Цепочка .find (), .sort (), .limit (), .select (), а затем .exec (). Передайте обратный вызов done (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>

View File

@ -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>
Используйте базовые типы схем mongoose. Если вы хотите, вы также можете добавить еще
полей, использовать простые валидаторы, такие как обязательные или уникальные,
и установить значения по умолчанию. Смотрите <a href='http://mongoosejs.com/docs/guide.html'>документы</a> по <a href='http://mongoosejs.com/docs/guide.html'>мангустам</a> .
[C] RUD Part I - CREATE
Примечание: Glitch - это настоящий сервер, и на реальных серверах взаимодействия с db происходят в функциях-обработчиках. Эти функции выполняются, когда происходит какое-то событие (например, кто-то попадает в конечную точку вашего API). Мы будем следовать тому же подходу в этих упражнениях. Функция done () - это обратный вызов, который говорит нам, что мы можем продолжить после завершения асинхронной операции, такой как вставка, поиск, обновление или удаление. Он следует соглашению Node и должен вызываться как done (null, data) в случае успеха или done (err) в случае ошибки.
Предупреждение. При взаимодействии с удаленными службами могут возникнуть ошибки!
<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>

View File

@ -0,0 +1,46 @@
---
id: 587d7fb6367417b2b2512c09
title: Create and Save a Record of a Model
localeTitle: Создать и сохранить запись модели
challengeType: 2
---
## Description
<section id='description'>
Создайте экземпляр документа с помощью созданного ранее конструктора Person. Передайте в конструктор объект с полями name, age и FavoritesFoods. Их типы должны соответствовать типам в схеме Person. Затем вызовите метод document.save () для возвращенного экземпляра документа. Передайте ему обратный вызов, используя соглашение Node. Это общий шаблон, все последующие методы 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: Создание и сохранение элемента БД должно завершиться успешно
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>

View File

@ -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', ...}, {...}, ...], в качестве первого аргумента и сохраняет их все в БД. Создайте много людей с Model.create (), используя аргумент функции arrayOfPeople.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Создание нескольких элементов БД одновременно должно быть успешным
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>

View File

@ -0,0 +1,42 @@
---
id: 587d7fb8367417b2b2512c11
title: Delete Many Documents with model.remove()
localeTitle: Удалить много документов с model.remove ()
challengeType: 2
---
## Description
<section id='description'>
Model.remove () полезна для удаления всех документов, соответствующих заданным критериям. Удалите всех людей с именем «Мэри», используя Model.remove (). Передайте его в документ запроса с установленным полем «имя» и, конечно, с обратным вызовом.
Примечание: Model.remove () возвращает не удаленный документ, а объект JSON, содержащий результат операции и количество затронутых элементов. Не забудьте передать его обратному вызову done (), так как мы используем его в тестах.
</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>

View File

@ -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. Как обычно, используйте аргумент функции 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>

View File

@ -0,0 +1,45 @@
---
id: 587d7fb6367417b2b2512c06
title: Install and Set Up Mongoose
localeTitle: Установить и настроить Mongoose
challengeType: 2
---
## Description
<section id='description'>
Добавьте mongodb и mongoose в пакет проекта.json. Тогда требуй мангуста. Сохраните свой URI базы данных mLab в личном файле .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: Зависимость "mongoose" должна быть в 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>

View File

@ -0,0 +1,43 @@
---
id: 587d7fb8367417b2b2512c0e
title: 'Perform Classic Updates by Running Find, Edit, then Save'
localeTitle: «Выполните классические обновления, запустив Find, Edit, затем Save»
challengeType: 2
---
## Description
<section id='description'>
В старые добрые времена это было то, что вам нужно было сделать, если вы хотите отредактировать документ и иметь возможность каким-либо образом его использовать, например, отправив его обратно в ответе сервера. У Mongoose есть специальный метод обновления: Model.update (). Он привязан к низкоуровневому драйверу монго. Он может массово редактировать многие документы, соответствующие определенным критериям, но он не отправляет обратно обновленный документ, только сообщение о статусе. Кроме того, это затрудняет проверку модели, потому что она просто вызывает драйвер Монго.
Найдите человека по _id (используйте любой из вышеперечисленных методов) с параметром personId в качестве ключа поиска. Добавьте «гамбургер» в список ее любимых продуктов (вы можете использовать Array.push ()). Затем - внутри обратного вызова find - save () обновленный Person.
[*] Подсказка: это может быть непросто, если в вашей Схеме вы объявили FavoritesFoods как Массив без указания типа (например, [String]). В этом случае по умолчанию в файле favourFoods используется смешанный тип, и вы должны вручную пометить его как отредактированный с помощью 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>

View File

@ -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'>
последних версиях mongoose есть методы, упрощающие обновление документов. Некоторые более продвинутые функции (например, до / после перехвата, проверка) ведут себя по-разному с этим подходом, поэтому метод Classic по-прежнему полезен во многих ситуациях. findByIdAndUpdate () может использоваться при поиске по Id.
Найдите человека по имени и установите для него возраст 20. Используйте параметр функции personName в качестве ключа поиска.
Подсказка: мы хотим, чтобы вы вернули обновленный документ. Для этого вам нужно передать документ параметров {new: true} в качестве 3-го аргумента для findOneAndUpdate (). По умолчанию эти методы возвращают неизмененный объект.
</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>

View File

@ -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 () -&gt; [Person]
В простейшем случае Model.find () принимает документ запроса (объект JSON) в качестве первого аргумента, а затем обратный вызов. Возвращает массив совпадений. Он поддерживает чрезвычайно широкий спектр параметров поиска. Проверьте это в документах. Используйте аргумент функции 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>

View File

@ -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 является чрезвычайно частой операцией, поэтому mongoose предоставляет для нее специальный метод. Найдите (только !!) человека, имеющего данный _id, используя Model.findById () -&gt; Person. Используйте аргумент функции 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>

View File

@ -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 () -&gt; Person. Используйте аргумент функции food в качестве ключа поиска.
</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>