fix: Add Api challenges - Portuguese translation (#35165)

* fix: Add Api challenges - Portuguese translation

* fix: md formatting
This commit is contained in:
Beau Carnes
2019-05-06 07:31:59 -04:00
committed by Tom
parent 6b1992ee7c
commit b85e849482
39 changed files with 1810 additions and 0 deletions

View File

@ -0,0 +1,52 @@
---
id: 5a8b073d06fa14fcfde687aa
title: Exercise Tracker
localeTitle: Rastreador de Exercícios
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Crie um aplicativo JavaScript de pilha completa que seja funcionalmente semelhante a este: <a href='https://fuschia-custard.glitch.me/' target='_blank'>https://fuschia-custard.glitch.me/</a> .
Trabalhar neste projeto envolverá você escrevendo seu código no Glitch em nosso projeto inicial. Depois de concluir este projeto, você pode copiar sua URL de falha pública (para a página inicial do seu aplicativo) nesta tela para testá-lo! Opcionalmente, você pode optar por escrever seu projeto em outra plataforma, mas deve estar publicamente visível para nossos testes.
iniciar este projeto em Glitch usando <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-exercisetracker/' target='_blank'>este link</a> ou clonar <a href='https://github.com/freeCodeCamp/boilerplate-project-exercisetracker/'>este repositório</a> no GitHub! Se você usa o Glitch, lembre-se de salvar o link do seu projeto em algum lugar seguro!
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Eu posso criar um usuário postando dados do formulário username para / api / exercise / new-user e retornado será um objeto com username e <code>_id</code> .
testString: ''
- text: Eu posso obter uma matriz de todos os usuários obtendo api / exercise / users com as mesmas informações que ao criar um usuário.
testString: ''
- text: Posso adicionar um exercício a qualquer usuário postando dados do formulário userId (_id), descrição, duração e, opcionalmente, data para / api / exercise / add. Se nenhuma data for fornecida, usará a data atual. O aplicativo retornará o objeto do usuário com os campos de exercício adicionados.
testString: ''
- text: Eu posso recuperar um log de exercício completo de qualquer usuário obtendo / api / exercise / log com um parâmetro de userId (_id). O aplicativo retornará o objeto do usuário com o registro da matriz adicionado e a contagem (contagem total de exercícios).
testString: ''
- text: 'Eu posso recuperar parte do log de qualquer usuário passando também parâmetros opcionais de &amp; para ou limite. (Formato de data aaaa-mm-dd, limite = 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: Metadados de Arquivo Microservice
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Crie um aplicativo JavaScript de pilha completa que seja funcionalmente semelhante a este: <a href='https://purple-paladin.glitch.me/' target='_blank'>https://purple-paladin.glitch.me/</a> .
Trabalhar neste projeto envolverá você escrevendo seu código no Glitch em nosso projeto inicial. Depois de concluir este projeto, você pode copiar sua URL de falha pública (para a página inicial do seu aplicativo) nesta tela para testá-lo! Opcionalmente, você pode optar por escrever seu projeto em outra plataforma, mas deve estar publicamente visível para nossos testes.
iniciar este projeto em Glitch usando <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-filemetadata/' target='_blank'>este link</a> ou clonar <a href='https://github.com/freeCodeCamp/boilerplate-project-filemetadata/'>este repositório</a> no GitHub! Se você usa o Glitch, lembre-se de salvar o link do seu projeto em algum lugar seguro!
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Eu posso enviar um objeto FormData que inclua um upload de arquivo.
testString: ''
- text: 'Quando eu enviar algo, receberei o tamanho do arquivo em bytes dentro da resposta 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: Solicitar Microservice do Analisador de Cabeçalhos
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Crie um aplicativo JavaScript de pilha completa que seja funcionalmente semelhante a este: <a href='https://dandelion-roar.glitch.me/' target='_blank'>https://dandelion-roar.glitch.me/</a> .
Trabalhar neste projeto envolverá você escrevendo seu código no Glitch em nosso projeto inicial. Depois de concluir este projeto, você pode copiar sua URL de falha pública (para a página inicial do seu aplicativo) nesta tela para testá-lo! Opcionalmente, você pode optar por escrever seu projeto em outra plataforma, mas deve estar publicamente visível para nossos testes.
iniciar este projeto em Glitch usando <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-headerparser/' target='_blank'>este link</a> ou clonar <a href='https://github.com/freeCodeCamp/boilerplate-project-headerparser/'>este repositório</a> no GitHub! Se você usa o Glitch, lembre-se de salvar o link do seu projeto em algum lugar seguro!
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'Eu posso obter o endereço IP, idioma e sistema operacional para o meu navegador.'
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: Microservice de registro de data e hora
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Crie um aplicativo JavaScript de pilha completa que seja funcionalmente semelhante a este: <a href='https://curse-arrow.glitch.me/' target='_blank'>https://curse-arrow.glitch.me/</a> .
Trabalhar neste projeto envolverá você escrevendo seu código no Glitch em nosso projeto inicial. Depois de concluir este projeto, você pode copiar sua URL de falha pública (para a página inicial do seu aplicativo) nesta tela para testá-lo! Opcionalmente, você pode optar por escrever seu projeto em outra plataforma, mas deve estar publicamente visível para nossos testes.
iniciar este projeto em Glitch usando <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-timestamp/' target='_blank'>este link</a> ou clonar <a href='https://github.com/freeCodeCamp/boilerplate-project-timestamp/'>este repositório</a> no GitHub! Se você usa o Glitch, lembre-se de salvar o link do seu projeto em algum lugar seguro!
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'Ele deve manipular uma data válida e retornar o registro de data e hora correto do 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: 'Ele deve manipular uma data válida e retornar a string UTC correta'
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: 'Ele deve manipular uma data unix válida e retornar o registro de data e hora correto do unix'
testString: 'getUserInput => $.get(getUserInput(''url'') + ''/api/timestamp/1482624000000'').then(data => { assert.equal(data.unix, 1482624000000) ; }, xhr => { throw new Error(xhr.responseText); })'
- text: Deve devolver a mensagem de erro esperada para uma data inválida
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: 'Ele deve manipular um parâmetro de data vazio e retornar a hora atual no formato 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: 'Ele deve manipular um parâmetro de data vazio e retornar a hora atual no formato 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: Microservice do Shortener de URL
challengeType: 4
isRequired: true
---
## Description
<section id='description'>
Crie um aplicativo JavaScript de pilha completa que seja funcionalmente semelhante a este: <a href='https://thread-paper.glitch.me/' target='_blank'>https://thread-paper.glitch.me/</a> .
Trabalhar neste projeto envolverá você escrevendo seu código no Glitch em nosso projeto inicial. Depois de concluir este projeto, você pode copiar sua URL de falha pública (para a página inicial do seu aplicativo) nesta tela para testá-lo! Opcionalmente, você pode optar por escrever seu projeto em outra plataforma, mas deve estar publicamente visível para nossos testes.
iniciar este projeto em Glitch usando <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-urlshortener/' target='_blank'>este link</a> ou clonar <a href='https://github.com/freeCodeCamp/boilerplate-project-urlshortener/'>este repositório</a> no GitHub! Se você usa o Glitch, lembre-se de salvar o link do seu projeto em algum lugar seguro!
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Posso passar um URL como parâmetro e receberei um URL abreviado na resposta JSON.
testString: ''
- text: 'Se eu passar um URL inválido que não segue o formato http://www.example.com válido, a resposta JSON conterá um erro.'
testString: ''
- text: "Quando visito esse URL encurtado, ele me redireciona para o meu link original."
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: Chain Middleware para criar um servidor de horário
challengeType: 2
---
## Description
<section id='description'>
Middleware pode ser montado em uma rota específica usando <code>app.METHOD(path, middlewareFunction)</code> . O middleware também pode ser encadeado dentro da definição da rota.
Veja o seguinte exemplo:
<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>
Essa abordagem é útil para dividir as operações do servidor em unidades menores. Isso leva a uma estrutura de aplicativo melhor e à possibilidade de reutilizar códigos em locais diferentes. Essa abordagem também pode ser usada para executar alguma validação nos dados. Em cada ponto da pilha de middlewares, você pode bloquear a execução da corrente atual e passar o controle para funções especificamente projetadas para lidar com erros. Ou você pode passar o controle para a próxima rota correspondente, para lidar com casos especiais. Vamos ver como na seção Express avançada.
Na rota <code>app.get('/now', ...)</code> uma função de middleware e o manipulador final. Na função middleware você deve adicionar a hora atual ao objeto request na chave <code>req.time</code> . Você pode usar o <code>new Date().toString()</code> . No manipulador, responda com um objeto JSON, usando a estrutura <code>{time: req.time}</code> .
Dica: O teste não passará se você não encadear o middleware. Se você montar a função em outro lugar, o teste falhará, mesmo se o resultado da saída estiver correto.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: O ponto de extremidade / now deve ter o middleware montado
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: O ponto final / now deve retornar um tempo que é de +/- 20 segundos a partir de agora
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: Obter dados de solicitações de POST
challengeType: 2
---
## Description
<section id='description'>
Monte um manipulador POST no caminho <code>/name</code> . É o mesmo caminho de antes. Nós preparamos um formulário no frontpage html. Ele enviará os mesmos dados do exercício 10 (string de consulta). Se o analisador de corpo estiver configurado corretamente, você deverá encontrar os parâmetros no objeto <code>req.body</code> . Dê uma olhada no exemplo usual de biblioteca:
<blockquote>route: POST '/library'<br>urlencoded_body: userId=546&bookId=6754 <br>req.body: {userId: '546', bookId: '6754'}</blockquote>
Responda com o mesmo objeto JSON de antes: <code>{name: 'firstname lastname'}</code> . Teste se seu endpoint funciona usando o formulário html fornecido na página principal do aplicativo.
Dica: Existem vários outros métodos de HTTP além de GET e POST. E por convenção existe uma correspondência entre o verbo http e a operação que você vai executar no servidor. O mapeamento convencional é:
POST (às vezes PUT) - Cria um novo recurso usando as informações enviadas com o pedido,
GET - Lê um recurso existente sem modificá-lo,
PUT ou PATCH (às vezes POST) - Atualiza um recurso usando os dados enviado,
DELETE =&gt; Excluir um recurso.
Existem também alguns outros métodos que são usados para negociar uma conexão com o servidor. Exceto pelo GET, todos os outros métodos listados acima podem ter uma carga útil (ou seja, os dados no corpo da solicitação). O middleware do analisador de corpo também funciona com esses métodos.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'Teste 1: o endpoint da sua API deve responder com o nome correto'
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: 'Teste 2: seu endpoint da API deve responder com o nome correto'
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: Obter entrada de parâmetro de consulta do cliente
challengeType: 2
---
## Description
<section id='description'>
Outra maneira comum de obter entrada do cliente é codificando os dados após o caminho da rota, usando uma string de consulta. A cadeia de consulta é delimitada por um ponto de interrogação (?) E inclui pares campo = valor. Cada casal é separado por um e comercial (&amp;). O Express pode analisar os dados da cadeia de consulta e preencher o objeto <code>req.query</code> . Alguns caracteres não podem estar em URLs, eles precisam ser codificados em um <a href='https://en.wikipedia.org/wiki/Percent-encoding' target='_blank'>formato diferente</a> antes de você poder enviá-los. Se você usar a API do JavaScript, poderá usar métodos específicos para codificar / decodificar esses caracteres.
<blockquote>route_path: '/library'<br>actual_request_URL: '/library?userId=546&bookId=6754' <br>req.query: {userId: '546', bookId: '6754'}</blockquote>
Construa um endpoint da API, montado em <code>GET /name</code> . Responda com um documento JSON, tomando a estrutura <code>{ name: 'firstname lastname'}</code> . Os parâmetros de nome e sobrenome devem ser codificados em uma string de consulta, por exemplo, <code>?first=firstname&amp;last=lastname</code> .
DICA: No exercício a seguir, vamos receber dados de uma solicitação POST, no mesmo caminho de rota <code>/name</code> . Se você quiser, pode usar o método <code>app.route(path).get(handler).post(handler)</code> . Essa sintaxe permite encadear diferentes manipuladores de verbo na mesma rota de caminho. Você pode economizar um pouco de digitação e ter um código mais limpo.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'Teste 1: o endpoint da sua API deve responder com o nome correto'
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: 'Teste 2: seu ponto de extremidade APi deve responder com o nome correto'
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: Obter entrada de parâmetro de rota do cliente
challengeType: 2
---
## Description
<section id='description'>
Ao criar uma API, precisamos permitir que os usuários nos comuniquem o que desejam obter de nosso serviço. Por exemplo, se o cliente estiver solicitando informações sobre um usuário armazenado no banco de dados, ele precisará de uma maneira de nos informar em qual usuário está interessado. Uma maneira possível de obter esse resultado é usando parâmetros de rota. Os parâmetros de rota são denominados segmentos da URL, delimitados por barras (/). Cada segmento captura o valor da parte do URL que corresponde à sua posição. Os valores capturados podem ser encontrados no objeto <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>
Construa um servidor de eco, montado na rota <code>GET /:word/echo</code> . Responda com um objeto JSON, tomando a estrutura <code>{echo: word}</code> . Você pode encontrar a palavra a ser repetida em <code>req.params.word</code> . Você pode testar sua rota a partir da barra de endereços do seu navegador, visitando algumas rotas correspondentes, por exemplo, your-app-rootpath / freecodecamp / echo
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'Teste 1: seu servidor de eco deve repetir palavras corretamente'
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: 'Teste 2: seu servidor de eco deve repetir palavras corretamente'
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: Implementar um middleware de logger de solicitação de nível raiz
challengeType: 2
---
## Description
<section id='description'>
Antes de introduzirmos a função de middleware <code>express.static()</code> . Agora é hora de ver qual middleware é, com mais detalhes. As funções de middleware são funções que levam 3 argumentos: o objeto de solicitação, o objeto de resposta e a próxima função no ciclo de solicitação-resposta do aplicativo. Essas funções executam algum código que pode ter efeitos colaterais no aplicativo e geralmente adicionam informações aos objetos de solicitação ou resposta. Eles também podem terminar o ciclo enviando a resposta, quando alguma condição é atendida. Se eles não enviarem a resposta, quando eles terminarem, iniciarão a execução da próxima função na pilha. Isso é acionado chamando o terceiro argumento em <code>next()</code> . Mais informações na <a href='http://expressjs.com/en/guide/using-middleware.html' target='_blank'>documentação expressa</a> .
Veja o seguinte exemplo:
<blockquote>function(req, res, next) {<br> console.log("I'm a middleware...");<br> next();<br>}</blockquote>
Vamos supor que montamos essa função em uma rota. Quando uma solicitação corresponde à rota, ela exibe a string "Sou um middleware ...". Em seguida, ele executa a próxima função na pilha.
Neste exercício, vamos construir um middleware de nível raiz. Como vimos no desafio 4, para montar uma função de middleware no nível da raiz, podemos usar o método <code>app.use(&lt;mware-function&gt;)</code> . Nesse caso, a função será executada para todas as solicitações, mas você também pode definir condições mais específicas. Por exemplo, se você quiser que uma função seja executada apenas para solicitações POST, você pode usar <code>app.post(&lt;mware-function&gt;)</code> . Existem métodos análogos para todos os verbos http (GET, DELETE, PUT,…).
Construa um logger simples. Para cada requisição, deve logar no console uma string tomando o seguinte formato: <code>method path - ip</code> . Um exemplo seria: <code>GET /json - ::ffff:127.0.0.1</code> . Observe que há um espaço entre o <code>method</code> e o <code>path</code> e que o traço que separa o <code>path</code> e o <code>ip</code> é cercado por um espaço em ambos os lados. Você pode obter o método de solicitação (verbo http), o caminho de rota relativo e o ip do chamador do objeto de solicitação, usando <code>req.method</code> , <code>req.path</code> e <code>req.ip</code> Lembre-se de chamar <code>next()</code> quando terminar, ou seu servidor ficará preso para sempre. Certifique-se de ter aberto o 'Logs' e veja o que acontece quando chega algum pedido…
Dica: o Express avalia funções na ordem em que aparecem no código. Isso também é verdade para o middleware. Se você quer que ele funcione para todas as rotas, ele deve ser montado antes delas.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: O middleware do registrador de nível raiz deve estar ativo
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: Conheça o console do nó
challengeType: 2
---
## Description
<section id='description'>
Durante o processo de desenvolvimento, é importante poder verificar o que está acontecendo em seu código. O nó é apenas um ambiente JavaScript. Como o JavaScript do lado do cliente, você pode usar o console para exibir informações de depuração úteis. Na sua máquina local, você veria a saída do console em um terminal. Na Glitch você pode abrir os logs na parte inferior da tela. Você pode alternar o painel de registro com o botão "Registros" (no canto superior esquerdo, sob o nome do aplicativo).
Para começar, basta imprimir o clássico "Hello World" no console. Recomendamos manter o painel de registro aberto enquanto trabalha nesses desafios. Lendo os logs você pode estar ciente da natureza dos erros que podem ocorrer.
</section>
## Instructions
<section id='instructions'>
Modifique o arquivo <code>myApp.js</code> para registrar "Hello World" no console.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: <code>"Hello World"</code> deve estar no console
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: Servir um arquivo HTML
challengeType: 2
---
## Description
<section id='description'>
Podemos responder com um arquivo usando o método <code>res.sendFile(path)</code> .
Você pode colocá-lo dentro do manipulador de rota <code>app.get('/', ...)</code> . Nos bastidores, este método irá definir os cabeçalhos apropriados para instruir o seu navegador sobre como lidar com o arquivo que você deseja enviar, de acordo com o seu tipo. Então ele irá ler e enviar o arquivo. Esse método precisa de um caminho de arquivo absoluto. Recomendamos que você use a variável global do nó <code>__dirname</code> para calcular o caminho.
exemplo <code>absolutePath = __dirname + relativePath/file.ext</code> .
O arquivo a ser enviado é <code>/views/index.html</code> . Tente "Mostrar ao vivo" seu aplicativo, você deve ver um grande título HTML (e um formulário que usaremos mais tarde ...), sem estilo aplicado.
Nota: Você pode editar a solução do desafio anterior ou criar uma nova. Se você criar uma nova solução, lembre-se de que o Express avalia as rotas de cima para baixo. Ele executa o manipulador para o primeiro jogo. Você precisa comentar a solução anterior ou o servidor continuará respondendo com uma string.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Seu aplicativo deve exibir o arquivo 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: Servir JSON em uma rota específica
challengeType: 2
---
## Description
<section id='description'>
Enquanto um servidor HTML exibe (você adivinhou!) HTML, uma API exibe dados. Uma API <dfn>REST</dfn> (REpresentational State Transfer) permite a troca de dados de maneira simples, sem a necessidade de os clientes conhecerem detalhes sobre o servidor. O cliente só precisa saber onde o recurso está (a URL) e a ação que deseja executar nele (o verbo). O verbo GET é usado quando você está buscando algumas informações, sem modificar nada. Atualmente, o formato de dados preferencial para mover informações pela Web é o JSON. Simplificando, o JSON é uma maneira conveniente de representar um objeto JavaScript como uma string, para que ele possa ser facilmente transmitido.
Vamos criar uma API simples criando uma rota que responda com JSON no caminho <code>/json</code> . Você pode fazer isso normalmente, com o método <code>app.get()</code> . Dentro do manipulador de rota, use o método <code>res.json()</code> , passando um objeto como argumento. Este método fecha o loop de solicitação-resposta, retornando os dados. Nos bastidores, ele converte um objeto JavaScript válido em uma string e, em seguida, define os cabeçalhos apropriados para informar ao seu navegador que você está exibindo JSON e envia os dados de volta. Um objeto válido tem a estrutura usual <code>{key: data}</code> . Os dados podem ser um número, uma string, um objeto aninhado ou uma matriz. Os dados também podem ser uma variável ou o resultado de uma chamada de função; nesse caso, ela será avaliada antes de ser convertida em uma string.
Sirva o objeto <code>{"message": "Hello json"}</code> como uma resposta no formato JSON, para as requisições GET para o route <code>/json</code> . Em seguida, aponte seu navegador para seu app-url / json, você deverá ver a mensagem na tela.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'O endpoint <code>/json</code> deve servir o objeto 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: Ative os recursos estáticos
challengeType: 2
---
## Description
<section id='description'>
Um servidor HTML geralmente possui um ou mais diretórios que são acessíveis pelo usuário. Você pode colocar aí os recursos estáticos necessários para sua aplicação (folhas de estilo, scripts, imagens). No Express, você pode colocar em prática essa funcionalidade usando o middleware <code>express.static(path)</code> , em que o parâmetro é o caminho absoluto da pasta que contém os ativos. Se você não sabe o que é um middleware, não se preocupe. Vamos discutir sobre isso mais tarde em detalhes. Basicamente middlewares são funções que interceptam manipuladores de rota, adicionando algum tipo de informação. Um middleware precisa ser montado usando o método <code>app.use(path, middlewareFunction)</code> . O primeiro argumento de caminho é opcional. Se você não passar, o middleware será executado para todas as requisições.
Monte o middleware <code>express.static()</code> para todas as solicitações com <code>app.use()</code> . O caminho absoluto para a pasta de recursos é <code>__dirname + /public</code> .
Agora, seu aplicativo deve poder exibir uma folha de estilo CSS. De fora a pasta pública aparecerá montada no diretório raiz. Sua primeira página deve parecer um pouco melhor agora!
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Seu aplicativo deve exibir arquivos de recursos do diretório <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: Inicie um servidor do Working Express
challengeType: 2
---
## Description
<section id='description'>
Nas duas primeiras linhas do arquivo myApp.js você pode ver como é fácil criar um objeto de aplicativo Express. Esse objeto tem vários métodos e aprenderemos muitos deles nesses desafios. Um método fundamental é <code>app.listen(port)</code> . Ele diz ao seu servidor para escutar em uma determinada porta, colocando-o em estado de execução. Você pode vê-lo na parte inferior do arquivo. Ele está dentro dos comentários porque, por motivos de teste, precisamos que o aplicativo esteja em execução em segundo plano. Todo o código que você deseja adicionar vai entre essas duas partes fundamentais. Glitch armazena o número da porta na variável de ambiente <code>process.env.PORT</code> . Seu valor é <code>3000</code> .
Vamos servir nossa primeira string! No Express, as rotas levam a seguinte estrutura: <code>app.METHOD(PATH, HANDLER)</code> . MÉTODO é um método http em minúsculas. PATH é um caminho relativo no servidor (pode ser uma string ou até uma expressão regular). HANDLER é uma função que o Express chama quando a rota é correspondida.
Manipuladores assumem a <code>function(req, res) {...}</code> form <code>function(req, res) {...}</code> , em que req é o objeto request e res é o objeto response. Por exemplo, o manipulador
<blockquote>function(req, res) {<br> res.send('Response String');<br>}</blockquote>
servirá a string 'Response String'.
Use o método <code>app.get()</code> para exibir a string Hello Express, para solicitações GET correspondentes ao caminho / root. Certifique-se de que seu código funciona observando os registros e, em seguida, veja os resultados no seu navegador, clicando no botão "Mostrar ao vivo" na interface do usuário do Glitch.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Seu aplicativo deve exibir a string "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: Use o analisador de corpo para analisar solicitações de POST
challengeType: 2
---
## Description
<section id='description'>
Além de GET, existe outro verbo http comum, é o POST. POST é o método padrão usado para enviar dados do cliente com formulários HTML. Na convenção REST, o POST é usado para enviar dados para criar novos itens no banco de dados (um novo usuário ou uma nova postagem no blog). Não temos um banco de dados neste projeto, mas vamos aprender como lidar com solicitações POST de qualquer maneira.
Nesse tipo de solicitações, os dados não aparecem no URL, eles estão ocultos no corpo da solicitação. Esta é uma parte da solicitação HTML, também chamada de payload. Como o HTML é baseado em texto, mesmo que você não veja os dados, isso não significa que eles sejam secretos. O conteúdo bruto de uma solicitação HTTP POST é mostrado abaixo:
<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>
Como você pode ver, o corpo é codificado como a string de consulta. Este é o formato padrão usado pelos formulários HTML. Com o Ajax, também podemos usar JSON para manipular dados com uma estrutura mais complexa. Há também outro tipo de codificação: multipart / form-data. Este é usado para fazer upload de arquivos binários.
Neste exercício, usaremos um corpo com codificação de URL.
Para analisar os dados provenientes de solicitações POST, você precisa instalar um pacote: o analisador de corpo. Este pacote permite que você use uma série de middleware, que pode decodificar dados em diferentes formatos. Veja os documentos <a href="https://github.com/expressjs/body-parser" target="_blank" >aqui</a> .
Instale o módulo body-parser no seu package.json. Em seguida, solicite-o no topo do arquivo. Armazene-o em uma variável chamada bodyParser.
O middleware para manipular dados codificados em URL é retornado por <code>bodyParser.urlencoded({extended: false})</code> . <code>extended=false</code> é uma opção de configuração que diz ao analisador para usar a codificação clássica. Ao usá-lo, os valores podem ser apenas strings ou matrizes. A versão estendida permite mais flexibilidade de dados, mas é superada pelo JSON. Passe para <code>app.use()</code> a função retornada pela chamada do método anterior. Como de costume, o middleware deve ser montado antes de todas as rotas que precisam dele.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: O middleware 'body-parser' deve ser montado
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: Use o arquivo .env
challengeType: 2
---
## Description
<section id='description'>
O arquivo <code>.env</code> é um arquivo oculto usado para transmitir variáveis de ambiente ao seu aplicativo. Este arquivo é secreto, ninguém além de você pode acessá-lo e pode ser usado para armazenar dados que você deseja manter privados ou ocultos. Por exemplo, você pode armazenar chaves de API de serviços externos ou do URI do seu banco de dados. Você também pode usá-lo para armazenar opções de configuração. Ao definir opções de configuração, você pode alterar o comportamento do seu aplicativo, sem a necessidade de reescrever algum código.
As variáveis de ambiente podem ser acessadas no aplicativo como <code>process.env.VAR_NAME</code> . O objeto <code>process.env</code> é um objeto Node global e as variáveis são passadas como strings. Por convenção, os nomes das variáveis são todos em maiúsculas, com palavras separadas por um sublinhado. O <code>.env</code> é um arquivo de shell, portanto, você não precisa <code>.env</code> nomes ou valores entre aspas. Também é importante observar que não pode haver espaço ao redor do sinal de igual quando você está atribuindo valores às suas variáveis, por exemplo, <code>VAR_NAME=value</code> . Normalmente, você irá colocar cada definição de variável em uma linha separada.
Vamos adicionar uma variável de ambiente como uma opção de configuração. Armazene a variável <code>MESSAGE_STYLE=uppercase</code> no arquivo <code>.env</code> . Em seguida, informe ao manipulador de rota GET <code>/json</code> que você criou no último desafio para transformar a mensagem do objeto de resposta em maiúsculas, se <code>process.env.MESSAGE_STYLE</code> for igual a <code>uppercase</code> . O objeto de resposta deve se tornar <code>{"message": "HELLO JSON"}</code> .
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: A resposta do nó de extremidade <code>/json</code> deve mudar de acordo com a variável de ambiente <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: Adicione uma descrição ao seu pacote.json
challengeType: 2
---
## Description
<section id='description'>
A próxima parte de um bom pacote.json é o campo de descrição, onde uma descrição curta, mas informativa, sobre o seu projeto pertence.
Se algum dia você planeja publicar um pacote para npm, lembre-se de que essa é a string que deve vender sua ideia ao usuário quando ele decidir se instala seu pacote ou não. No entanto, esse não é o único caso de uso para a descrição: é uma ótima maneira de resumir o que um projeto faz, tão importante para seus projetos normais do Node.js ajudar outros desenvolvedores, futuros mantenedores ou até mesmo seu futuro a entender o projeto rapidamente.
Independentemente do que você planeja para o seu projeto, uma descrição é definitivamente recomendada. Vamos adicionar algo semelhante a isto:
<code>"description": "A project that does something awesome",</code>
Instruções
Adicione uma descrição ao package.json em seu projeto Glitch.
Lembre-se de usar aspas duplas para nomes de campos (") e vírgulas (,) para separar campos.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'package.json deve ter uma chave de "descrição" válida'
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: Adicione uma licença ao seu pacote.json
challengeType: 2
---
## Description
<section id='description'>
O campo de licença é onde você informa aos usuários do seu projeto o que eles podem fazer com ele.
Algumas licenças comuns para projetos de código aberto incluem o MIT e o BSD. http://choosealicense.com é um ótimo recurso se você quiser saber mais sobre qual licença pode se encaixar em seu projeto.
Informações de licença não são necessárias. As leis de direitos autorais na maioria dos países dão a você a propriedade do que você cria por padrão. No entanto, é sempre uma boa prática declarar explicitamente o que os usuários podem e não podem fazer.
Exemplo
<code>"license": "MIT",</code>
Instruções
Preencha o campo de licença no package.json do seu projeto Glitch conforme achar conveniente.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'package.json deve ter uma chave de "licença" válida'
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: Adicione uma versão ao seu pacote.json
challengeType: 2
---
## Description
<section id='description'>
A versão é junto com o nome de um dos campos obrigatórios em um package.json. Este campo descreve a versão atual do seu projeto.
Exemplo
<code>"version": "1.2",</code>
Instruções
Adicione uma versão ao pacote.json no seu projeto Glitch.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'package.json deve ter uma chave "version" válida'
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: Adicione palavras-chave ao seu pacote.json
challengeType: 2
---
## Description
<section id='description'>
O campo de palavras-chave é onde você pode descrever seu projeto usando palavras-chave relacionadas.
Exemplo
<code>"keywords": [ "descriptive", "related", "words" ],</code>
Como você pode ver, este campo é estruturado como um array de strings com aspas duplas.
Instruções
Adicione uma matriz de strings adequadas ao campo keywords no package.json do seu projeto Glitch.
Uma das palavras-chave deve ser freecodecamp.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'package.json deve ter uma chave "keywords" válida'
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: 'palavras-chave campo deve ser uma matriz '
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: '"palavras-chave" devem incluir "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: Expanda seu projeto com pacotes externos do npm
challengeType: 2
---
## Description
<section id='description'>
Um dos maiores motivos para usar um gerenciador de pacotes é seu poderoso gerenciamento de dependências. Em vez de ter que certificar-se de que você obtém todas as dependências manualmente sempre que você configura um projeto em um novo computador, o npm instala automaticamente tudo para você. Mas como pode o npm saber exatamente o que seu projeto precisa? Conheça a seção de dependências do seu package.json.
Na seção dependencies, os pacotes que o seu projeto requer são armazenados usando o seguinte formato:
<code>"dependencies": {</code>
<code>"package-name": "version",</code>
<code>"express": "4.14.0"</code>
<code>}</code>
Instruções
Adicione a versão 2.14.0 do momento do pacote ao campo dependencies do seu pacote.json
Moment é uma biblioteca útil para trabalhar com hora e datas.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: "dependências devem incluir 'momento' "
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: 'A versão "momento" deve ser "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: 'Como usar o package.json, o Core de qualquer projeto Node.js ou npm Package'
challengeType: 2
---
## Description
<section id='description'>
O arquivo package.json é o centro de qualquer projeto Node.js ou pacote npm. Ele armazena informações sobre seu projeto da mesma forma que a seção &lt;head&gt; em um documento HTML descreve o conteúdo de uma página da Web. O pacote.json consiste em um único objeto JSON, onde as informações são armazenadas em "chave": pares de valores. Existem apenas dois campos obrigatórios em um pacote mínimo.json - nome e versão - mas é uma boa prática fornecer informações adicionais sobre o seu projeto que podem ser úteis para futuros usuários ou mantenedores.
O autor-campo
Se você for ao projeto Glitch que você configurou anteriormente e olhar no lado esquerdo da sua tela, você encontrará a árvore de arquivos onde você pode ver uma visão geral dos vários arquivos em seu projeto. Sob a seção de back-end da árvore de arquivos, você encontrará o pacote.json - o arquivo que estaremos aprimorando nos próximos desafios.
Uma das informações mais comuns neste arquivo é o autor-campo que especifica quem é o criador de um projeto. Pode ser uma string ou um objeto com detalhes de contato. O objeto é recomendado para projetos maiores, mas no nosso caso, uma string simples como o exemplo a seguir serve.
<code>"author": "Jane Doe",</code>
Instruções
Adicione seu nome ao autor-campo no package.json do seu projeto Glitch.
Lembre-se que você está escrevendo JSON.
Todos os nomes de campos devem usar aspas duplas ("), por exemplo," autor "
Todos os campos devem ser separados por uma vírgula (,)
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'package.json deve ter uma chave "author" válida'
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: Gerenciar Dependências do npm Entendendo o Versionamento Semântico
challengeType: 2
---
## Description
<section id='description'>
Versões dos pacotes npm na seção de dependências do seu package.json seguem o que é chamado de Semântica, um padrão da indústria para versionamento de software com o objetivo de facilitar o gerenciamento de dependências. Bibliotecas, estruturas ou outras ferramentas publicadas no npm devem usar o SemVer para comunicar claramente que tipo de mudanças os projetos que dependem do pacote podem esperar se atualizarem.
SemVer não faz sentido em projetos sem APIs públicas - portanto, a menos que seu projeto seja semelhante aos exemplos acima, use outro formato de versão.
Então, por que você precisa entender a SemVer?
Saber SemVer pode ser útil quando você desenvolve softwares que usam dependências externas (o que você quase sempre faz). Um dia, a sua compreensão desses números evitará que você introduza acidentalmente alterações inesperadas em seu projeto sem entender por que as coisas “que funcionaram ontem” de repente não o fazem.
É assim que o Versioning Semântico funciona de acordo com o site oficial:
Dado um número de versão MAJOR.MINOR.PATCH, incremente a:
versão MAJOR quando você faz alterações incompatíveis de API, versão
MINOR quando adiciona funcionalidade de maneira compatível com versões anteriores e
versão PATCH quando você faz correções de bugs compatíveis com versões anteriores.
Isso significa que os PATCHES são correções de bugs e os MINORs adicionam novos recursos, mas nenhum deles quebra o que funcionou antes. Finalmente, os MAJORs adicionam alterações que não funcionam com versões anteriores.
Exemplo
Um número de versão semântica: 1.3.8
Instruções
Na seção dependencies do seu pacote.json, altere a versão do momento para coincidir com MAJOR versão 2, MINOR versão 10 e PATCH versão 2
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: "dependências devem incluir 'momento' "
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: 'A versão "momento" deve ser "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: Remover um pacote de suas dependências
challengeType: 2
---
## Description
<section id='description'>
Agora você testou algumas maneiras de gerenciar dependências do seu projeto usando a seção de dependências do package.json. Você incluiu pacotes externos adicionando-os ao arquivo e até informou ao npm que tipos de versões você deseja usando caracteres especiais como o til (~) ou o cursor (^).
Mas e se você quiser remover um pacote externo que não precisa mais? Você já deve ter adivinhado - Apenas remova a "chave" correspondente: par de valores para isso de suas dependências.
Esse mesmo método se aplica à remoção de outros campos no seu package.json também
Instruções
Remova o momento do pacote de suas dependências.
Verifique se você tem a quantidade certa de vírgulas depois de removê-lo.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: "'dependências' não devem incluir 'momento' "
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: Use o Caret Caret para usar a última versão menor de uma dependência
challengeType: 2
---
## Description
<section id='description'>
Semelhante ao modo como o til (~) que aprendemos no último desafio permite que o npm instale o último PATCH para uma dependência, o cursor (^) também permite que o npm instale atualizações futuras. A diferença é que o cursor permite tanto atualizações MINORIS quanto PATCHES.
No momento, sua versão atual do momento deve ser ~ 2.10.2, que permite que o npm seja instalado na última versão 2.10.x. Se, em vez disso, usássemos o cursor (^) como nosso prefixo de versão, o npm teria permissão para atualizar para qualquer versão 2.xx.
Exemplo
<code>"some-package-name": "^1.3.8" allows updates to any 1.xx version.</code>
Instruções
Use o caractere de interpolação (^) para prefixar a versão do momento em suas dependências e permitir que o npm a atualize para qualquer nova versão MINOR.
Observe que os números da versão não devem ser alterados.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: "'dependências' devem incluir 'momento' "
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: 'A versão "momento" deve corresponder a "^ 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: Use o caractere Tilde para sempre usar a versão de patch mais recente de uma dependência
challengeType: 2
---
## Description
<section id='description'>
No último desafio, dissemos ao npm para incluir apenas uma versão específica de um pacote. Essa é uma maneira útil de congelar suas dependências se você precisar garantir que partes diferentes do seu projeto permaneçam compatíveis umas com as outras. Mas, na maioria dos casos de uso, você não quer perder correções de bugs, pois elas geralmente incluem patches de segurança importantes e (espero) não quebram as coisas ao fazê-lo.
Para permitir que uma dependência npm seja atualizada para a versão PATCH mais recente, você pode prefixar a versão da dependência com o caractere til (~). Em package.json, nossa regra atual de como o npm pode atualizar o momento é usar apenas uma versão específica (2.10.2), mas queremos permitir a última versão 2.10.x.
Exemplo
<code>"some-package-name": "~1.3.8" allows updates to any 1.3.x version.</code>
Instruções
Use o til (~) para prefixar a versão do momento em suas dependências e permitir que o npm o atualize para qualquer nova versão do PATCH.
Observe que os números da versão não devem ser alterados.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: "'dependências' devem incluir 'momento' "
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: 'A versão "momento" deve corresponder a "~ 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: Auxiliares de consulta de pesquisa em cadeia para restringir os resultados da pesquisa
challengeType: 2
---
## Description
<section id='description'>
Se você não passar o retorno de chamada como o último argumento para Model.find () (ou para os outros métodos de pesquisa), a consulta não será executada. Você pode armazenar a consulta em uma variável para uso posterior. Esse tipo de objeto permite que você crie uma consulta usando a sintaxe de encadeamento. A pesquisa real do banco de dados é executada quando você encadeia o método .exec (). Passe seu retorno de chamada para este último método. Existem muitos helpers de consulta, aqui usaremos os mais "famosos".
Encontre pessoas que gostam de "burrito". Ordena-os pelo nome, limita os resultados a dois documentos e oculta a idade. Cadeia .find (), .sort (), .limit (), .select () e, em seguida, .exec (). Passe o retorno de chamada concluído (err, data) para exec ().
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Encadeamento de helpers de consulta deve ser bem-sucedido
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: Crie um modelo
challengeType: 2
---
## Description
<section id='description'>
Primeiro de tudo, precisamos de um esquema. Cada esquema mapeia para uma coleção do MongoDB. Ele define a forma dos documentos dentro dessa coleção.
Esquemas são blocos de construção para modelos. Eles podem ser aninhados para criar modelos complexos, mas, nesse caso, manteremos as coisas simples.
Um modelo permite criar instâncias de seus objetos, chamados documentos.
Crie uma pessoa com este protótipo:
<code>- Person Prototype -</code>
<code>--------------------</code>
<code>name : string [required]</code>
<code>age : number</code>
<code>favoriteFoods : array of strings (*)</code>
Use os tipos básicos de esquema do mangusto. Se desejar, você também pode adicionar mais
campos, usar validadores simples, como obrigatório ou exclusivo,
e definir valores padrão. Veja o <a href='http://mongoosejs.com/docs/guide.html'>mangusto docs</a> .
[C] RUD Parte I - CREATE
Nota: Glitch é um servidor real, e em servidores reais as interações com o banco de dados acontecem nas funções do manipulador. Essas funções são executadas quando algum evento acontece (por exemplo, alguém atinge um endpoint em sua API). Vamos seguir a mesma abordagem nesses exercícios. A função done () é um retorno de chamada que nos informa que podemos prosseguir após concluir uma operação assíncrona, como inserir, pesquisar, atualizar ou excluir. Está seguindo a convenção do Nó e deve ser chamado como concluído (nulo, dados) em sucesso, ou concluído (err) em erro.
Aviso - Ao interagir com serviços remotos, podem ocorrer erros!
<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: Criar uma instância de um esquema de mongoose deve ser bem-sucedido
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: Criar e salvar um registro de um modelo
challengeType: 2
---
## Description
<section id='description'>
Crie uma instância de documento usando o construtor Person que você construiu antes. Passe para o construtor um objeto com os campos name, age e favoriteFoods. Seus tipos devem estar em conformidade com os do esquema pessoal. Em seguida, chame o método document.save () na instância do documento retornado. Passe para ele um retorno de chamada usando a convenção Node. Esse é um padrão comum, todos os métodos CRUD a seguir assumem uma função de retorno de chamada como o último argumento.
<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: Criar e salvar um item do banco de dados deve ser bem-sucedido
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: Crie muitos registros com model.create ()
challengeType: 2
---
## Description
<section id='description'>
Às vezes, você precisa criar muitas instâncias de seus modelos, por exemplo, ao criar um banco de dados com dados iniciais. Model.create () pega uma matriz de objetos como [{name: 'John', ...}, {...}, ...] como o primeiro argumento e salva todos eles no banco de dados. Crie muitas pessoas com Model.create (), usando o argumento da função arrayOfPeople.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Criar muitos itens de banco de dados de uma só vez deve ser bem-sucedido
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: Excluir muitos documentos com model.remove ()
challengeType: 2
---
## Description
<section id='description'>
Model.remove () é útil para excluir todos os documentos que correspondem a determinados critérios. Exclua todas as pessoas cujo nome é "Mary", usando Model.remove (). Passe-o para um documento de consulta com o conjunto de campos “nome” e, claro, um retorno de chamada.
Nota: Model.remove () não retorna o documento excluído, mas um objeto JSON contendo o resultado da operação e o número de itens afetados. Não esqueça de passá-lo para o callback done (), já que o usamos em testes.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: A exclusão de muitos itens de uma só vez deve ser bem-sucedida
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: Excluir um documento usando model.findByIdAndRemove
challengeType: 2
---
## Description
<section id='description'>
Excluir uma pessoa por ela _id. Você deve usar um dos métodos findByIdAndRemove () ou findOneAndRemove (). Eles são como os métodos de atualização anteriores. Eles passam o documento removido para o cb. Como de costume, use o argumento da função personId como chave de busca.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: A exclusão de um item deve ser bem-sucedida
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: Instalar e configurar o mangusto
challengeType: 2
---
## Description
<section id='description'>
Adicione mongodb e mangusto ao package.json do projeto. Então exija mangusto. Armazene seu URI do banco de dados mLab no arquivo .env privado como MONGO_URI. Conecte-se ao banco de dados usando mongoose.connect ( <Your URI> )
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: "'mongodb' dependência deve estar em 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' dependência deve estar em 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: "'mangusto' deve ser conectado a um banco de dados"
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: 'Executar atualizações clássicas executando Localizar, editar e salvar'
challengeType: 2
---
## Description
<section id='description'>
Nos bons e velhos tempos isso era o que você precisava fazer se quisesse editar um documento e ser capaz de usá-lo de alguma forma, por exemplo, enviando-o de volta em uma resposta do servidor. O Mongoose possui um método de atualização dedicado: Model.update (). Ele é vinculado ao driver mongo de baixo nível. Ele pode editar em massa muitos documentos que atendem a determinados critérios, mas não envia de volta o documento atualizado, apenas uma mensagem de 'status'. Além disso, dificulta a validação de modelos, porque apenas chama diretamente o driver mongo.
Encontre uma pessoa por _id (use qualquer um dos métodos acima) com o parâmetro personId como chave de busca. Adicione "hamburger" à lista de seus favoriteFoods (você pode usar Array.push ()). Então - dentro do callback de busca - salve () a Pessoa atualizada.
[*] Dica: Isso pode ser complicado se no seu Schema você declarar favoriteFoods como Array, sem especificar o tipo (ie [String]). Em que casefavoriteFoods padrão para o tipo misto, e você tem que marcá-lo manualmente como editado usando document.markModified ('edited-field'). (http://mongoosejs.com/docs/schematypes.html - #Mixed)
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Localizar-editar-atualizar um item deve ser bem-sucedido
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: Executar novas atualizações em um documento usando model.findOneAndUpdate ()
challengeType: 2
---
## Description
<section id='description'>
Versões recentes do mongoose possuem métodos para simplificar a atualização de documentos. Alguns recursos mais avançados (isto é, ganchos de pré / pós, validação) se comportam de maneira diferente com essa abordagem, portanto, o método Clássico ainda é útil em muitas situações. findByIdAndUpdate () pode ser usado ao pesquisar por Id.
Encontre uma pessoa por Nome e defina sua idade como 20. Use o parâmetro de função personName como chave de pesquisa.
Dica: queremos que você devolva o documento atualizado. Para fazer isso, você precisa passar o documento de opções {new: true} como o terceiro argumento para findOneAndUpdate (). Por padrão, esses métodos retornam o objeto não modificado.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: findOneAndUpdate um item deve ter sucesso
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: Use model.find () para pesquisar seu banco de dados
challengeType: 2
---
## Description
<section id='description'>
Encontre todas as pessoas que possuem um determinado nome, usando Model.find () -&gt; [Person]
Em seu uso mais simples, Model.find () aceita um documento de consulta (um objeto JSON) como o primeiro argumento e, em seguida, um retorno de chamada. Ele retorna uma matriz de correspondências. Suporta uma gama extremamente ampla de opções de pesquisa. Verifique nos documentos. Use o argumento de função personName como chave de pesquisa.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Encontrar todos os itens correspondentes a um critério devem ser bem sucedidos
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: Use model.findById () para pesquisar seu banco de dados por _id
challengeType: 2
---
## Description
<section id='description'>
Ao salvar um documento, o mongodb adiciona automaticamente o campo _id e o configura para uma chave alfanumérica exclusiva. Pesquisar por _id é uma operação extremamente frequente, então o mangusto fornece um método dedicado para isso. Encontre a pessoa (somente !!) tendo um determinado _id, usando Model.findById () -&gt; Person. Use o argumento da função personId como chave de busca.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Encontrar um item por Id deve ter sucesso
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: Use model.findOne () para retornar um único documento correspondente do seu banco de dados
challengeType: 2
---
## Description
<section id='description'>
Model.findOne () se comporta como .find (), mas retorna apenas um documento (não uma matriz), mesmo se houver vários itens. É especialmente útil ao pesquisar por propriedades que você declarou como exclusivas. Encontre apenas uma pessoa que tenha uma certa comida em seus favoritos, usando Model.findOne () -&gt; Person. Use o argumento de função food como chave de busca.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Encontrar um item deve ser bem sucedido
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>