text:
# Node.js - Aula 05 - Exercício

**user:** [charles7421](https://github.com/charles7421)

**autor:** Charles de Freitas Garcia

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0

> npm -v
3.7.3

## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:

	* 1 dependência local
	* 1 dependência local de desenvolvimento
	* 1 dependência local opcional

> mkdir class05
> cd class05
> npm init
> cat package.json
{
  "name": "class05",
  "version": "1.0.0",
  "description": "Criação do projeto class05, como parte do exercicio do Workshop Be-MEAN",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "exercicios",
    "be-mean",
    "webschool",
    "nodejs"
  ],
  "author": "Charles de Freitas Garcia",
  "license": "MIT"
}

> sudo npm install --save gulp
> sudo npm install --save-dev debug
> sudo npm install --save-optional colors

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

> mkdir global
> cd global
> npm init
* Editei o package.json, adicionando o global.js como script.

´´´js
global.js
'use strict';

console.log(__dirname);
´´´
> cat package.json
{
  "name": "global",
  "version": "1.0.0",
  "description": "Imprime a variavel Global de caminh absoluto da pasta raiz",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "global" : "node global.js"
  },
  "keywords": [
    "teste",
    "global",
    "pasta"
  ],
  "author": "Charles de Freitas Garcia",
  "license": "MIT"
}
> npm run global
/home/charles/be-mean/nodejs/npm/global

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

__dirname
Retorna o diretório atual

console.log(__dirname);

__filename
Retorna o nome do arquivo (caminho absoluto) que iniciou esta execução

console.log(__filename);

clearInterval(t)
Finaliza um timer que foi criado com setInterval().

var interval = setInterval(function(){ timer()}, 1000);
clearInterval(interval);

clearTimeout(t)
Finaliza um timer que foi criado com setTimeOut().

var interval = setTimeOut(function(){ timer()}, 1000);
clearTimeout(interval);

setTimeOut()
Chama uma função ou valida uma expresão depois de um numero especificado de milisegundos.

setTimeout(function(){ alert("Hello"); }, 3000);

## Explique como funciona e de um exemplo de `process`.

Process é utilizado para manipular processos do sistema operacional. Por ser global, não necessita de require. Com ele podemos:

 * Matar (Kill) um processo do SO.
 * Descobrir o path de execução do Node.
 * Saber a memória utilizada pelo Node
 * ETC

## Criar um arquivo

'use strict';

var fs = require('fs');
var write = fs.writeFileSync("./teste.txt", "Eu foi criado com FS do Node.js");

## Ler um arquivo

'use strict';

var fs = require('fs');

fs.readFile('./teste.txt', 'utf8', function(err, data){
	if (err) throw err;
	console.log(data);
});

## Editar conteúdo desse arquivo

'use strict';

var fs = require('fs');

fs.appendFile('./teste.txt', '. Adicionando conteúdo via FS.', 'utf8', function(err, data){
	if (err) throw err;
	console.log(data);
});

## Deletar arquivo

'use strict';

var fs = require('fs');

fs.unlink('./teste.txt', function(err, data){
	if (err) throw err;
	console.log("Arquivo deletado");
});

## Renomear o arquivo

'use strict';

var fs = require('fs');

fs.rename('./teste.txt', './teste2.txt', function(err, result){
	if (err) throw err;
	console.log(result);
});

## Desafio

Continua...


text:
# Node.js - Aula 05 - Exercício

**user:** [sergiokopplin](https://github.com/sergiokopplin)

**autor:** Sergio Aragao Kopplin

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0

```JS
node -v
v5.4.1

npm -v
3.5.3
```

## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:

```
npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (be-mean-exercises)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository: (https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises.git)
keywords:
author:
license: (ISC)
About to write to /Users/kopplin/Desktop/be-mean-exercises/package.json:

{
  "name": "be-mean-exercises",
  "version": "1.0.0",
  "description": "- Coloque um email para login( hotmail não funciona ) - Após isso, clique em Webschool para entrar no link do slack - Coloque o email que você digitou antes e crie uma senha - Entre no channel `be-mean-instagram`",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises/issues"
  },
  "homepage": "https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises#readme"
}

Is this ok? (yes)
```

   * 1 dependência local

```
npm i lodash --save
be-mean-exercises@1.0.0 /Users/kopplin/Desktop/be-mean-exercises
└── lodash@4.3.0
```

   * 1 dependência local de desenvolvimento

```
npm i gulp --save-dev

npm WARN deprecated lodash@1.0.2: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^4.0.0
be-mean-exercises@1.0.0 /Users/kopplin/Desktop/be-mean-exercises
├─┬ browser-sync@2.11.1
│ ├─┬ chokidar@1.4.1
│ │ └─┬ fsevents@1.0.7
│ │   └─┬ node-pre-gyp@0.6.19
│ │     ├─┬ mkdirp@0.5.1
│ │     │ └── minimist@0.0.8
│ │     ├─┬ npmlog@2.0.0
│ │     │ └─┬ gauge@1.2.2
│ │     │   └─┬ lodash.pad@3.1.1
│ │     │     └── lodash._basetostring@3.0.1
│ │     └─┬ request@2.67.0
│ │       └─┬ har-validator@2.0.3
│ │         └─┬ chalk@1.1.1
│ │           ├── ansi-styles@2.1.0
│ │           ├─┬ has-ansi@2.0.0
│ │           │ └── ansi-regex@2.0.0
│ │           ├── strip-ansi@3.0.0
│ │           └── supports-color@2.0.0
│ └─┬ localtunnel@1.8.1
│   ├─┬ request@2.65.0
│   │ └─┬ har-validator@2.0.6
│   │   └─┬ chalk@1.1.1
│   │     ├── ansi-styles@2.1.0
│   │     ├─┬ has-ansi@2.0.0
│   │     │ └── ansi-regex@2.0.0
│   │     ├── strip-ansi@3.0.0
│   │     └── supports-color@2.0.0
│   └─┬ yargs@3.29.0
│     └─┬ cliui@3.1.0
│       ├─┬ string-width@1.0.1
│       │ └─┬ strip-ansi@3.0.0
│       │   └── ansi-regex@2.0.0
│       └─┬ strip-ansi@3.0.0
│         └── ansi-regex@2.0.0
└─┬ gulp@3.9.1
  ├── archy@1.0.0
  ├─┬ chalk@1.1.1
  │ ├── ansi-styles@2.1.0
  │ ├─┬ has-ansi@2.0.0
  │ │ └── ansi-regex@2.0.0
  │ ├── strip-ansi@3.0.0
  │ └── supports-color@2.0.0
  ├── deprecated@0.0.1
  ├─┬ gulp-util@3.0.7
  │ ├── array-differ@1.0.0
  │ ├── array-uniq@1.0.2
  │ ├── beeper@1.1.0
  │ ├─┬ chalk@1.1.1
  │ │ ├── ansi-styles@2.1.0
  │ │ ├─┬ has-ansi@2.0.0
  │ │ │ └── ansi-regex@2.0.0
  │ │ ├── strip-ansi@3.0.0
  │ │ └── supports-color@2.0.0
  │ ├── dateformat@1.0.12
  │ ├─┬ fancy-log@1.2.0
  │ │ ├─┬ chalk@1.1.1
  │ │ │ ├── ansi-styles@2.1.0
  │ │ │ ├─┬ has-ansi@2.0.0
  │ │ │ │ └── ansi-regex@2.0.0
  │ │ │ ├── strip-ansi@3.0.0
  │ │ │ └── supports-color@2.0.0
  │ │ └── time-stamp@1.0.0
  │ ├─┬ gulplog@1.0.0
  │ │ └── glogg@1.0.0
  │ ├─┬ has-gulplog@0.1.0
  │ │ └── sparkles@1.0.0
  │ ├── lodash._reescape@3.0.0
  │ ├── lodash._reevaluate@3.0.0
  │ ├── lodash._reinterpolate@3.0.0
  │ ├─┬ lodash.template@3.6.2
  │ │ ├── lodash._basetostring@3.0.1
  │ │ ├── lodash._basevalues@3.0.0
  │ │ ├─┬ lodash.escape@3.2.0
  │ │ │ └── lodash._root@3.0.0
  │ │ └── lodash.templatesettings@3.1.1
  │ ├─┬ multipipe@0.1.2
  │ │ └─┬ duplexer2@0.0.2
  │ │   └── readable-stream@1.1.13
  │ ├── replace-ext@0.0.1
  │ ├── through2@2.0.1
  │ └─┬ vinyl@0.5.3
  │   ├── clone@1.0.2
  │   └── clone-stats@0.0.1
  ├── interpret@1.0.0
  ├─┬ liftoff@2.2.0
  │ ├── extend@2.0.1
  │ ├─┬ findup-sync@0.3.0
  │ │ └── glob@5.0.15
  │ ├── flagged-respawn@0.3.1
  │ ├── rechoir@0.6.2
  │ └── resolve@1.1.7
  ├─┬ orchestrator@0.3.7
  │ ├── end-of-stream@0.1.5
  │ ├── sequencify@0.0.7
  │ └── stream-consume@0.1.0
  ├── pretty-hrtime@1.0.1
  ├── semver@4.3.6
  ├─┬ tildify@1.1.2
  │ └── os-homedir@1.0.1
  ├─┬ v8flags@2.0.11
  │ └── user-home@1.1.1
  └─┬ vinyl-fs@0.3.14
    ├── defaults@1.0.3
    ├─┬ glob-stream@3.1.18
    │ ├── glob@4.5.3
    │ ├─┬ glob2base@0.0.12
    │ │ └── find-index@0.1.1
    │ ├── ordered-read-streams@0.1.0
    │ ├─┬ through2@0.6.5
    │ │ └── readable-stream@1.0.33
    │ └── unique-stream@1.0.0
    ├─┬ glob-watcher@0.0.6
    │ └─┬ gaze@0.5.2
    │   └─┬ globule@0.1.0
    │     ├─┬ glob@3.1.21
    │     │ ├── graceful-fs@1.2.3
    │     │ └── inherits@1.0.2
    │     ├── lodash@1.0.2
    │     └─┬ minimatch@0.2.14
    │       ├── lru-cache@2.7.3
    │       └── sigmund@1.0.1
    ├── graceful-fs@3.0.8
    ├─┬ mkdirp@0.5.1
    │ └── minimist@0.0.8
    ├─┬ strip-bom@1.0.0
    │ ├── first-chunk-stream@1.0.0
    │ └── is-utf8@0.2.1
    ├─┬ through2@0.6.5
    │ └── readable-stream@1.0.33
    └─┬ vinyl@0.4.6
      └── clone@0.2.0
```

   * 1 dependência local opcional

```
npm i -O mongoose
be-mean-exercises@1.0.0 /Users/kopplin/Desktop/be-mean-exercises
├─┬ browser-sync@2.11.1
│ └─┬ chokidar@1.4.1
│   └─┬ fsevents@1.0.7
│     └─┬ node-pre-gyp@0.6.19
│       └── semver@5.1.0
└─┬ mongoose@4.4.3
  ├── bson@0.4.21
  ├── hooks-fixed@1.1.0
  ├── kareem@1.0.1
  ├─┬ mongodb@2.1.6
  │ ├── es6-promise@3.0.2
  │ ├─┬ mongodb-core@1.3.1
  │ │ └─┬ require_optional@1.0.0
  │ │   ├── resolve-from@2.0.0
  │ │   └── semver@5.1.0
  │ └── readable-stream@1.0.31
  ├── mpath@0.2.1
  ├── mpromise@0.5.5
  ├─┬ mquery@1.6.3
  │ ├── bluebird@2.9.26
  │ └── sliced@0.0.5
  ├── muri@1.1.0
  ├── regexp-clone@0.0.1
  └── sliced@1.0.1
```

```
{
  "name": "be-mean-exercises",
  "version": "1.0.0",
  "description": "- Coloque um email para login( hotmail não funciona ) - Após isso, clique em Webschool para entrar no link do slack - Coloque o email que você digitou antes e crie uma senha - Entre no channel `be-mean-instagram`",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises/issues"
  },
  "homepage": "https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises#readme",
  "dependencies": {
    "lodash": "^4.3.0"
  },
  "devDependencies": {
    "gulp": "^3.9.1"
  },
  "optionalDependencies": {
    "mongoose": "^4.4.3"
  }
}
```

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

```
{
  "name": "be-mean-exercises",
  "version": "1.0.0",
  "description": "- Coloque um email para login( hotmail não funciona ) - Após isso, clique em Webschool para entrar no link do slack - Coloque o email que você digitou antes e crie uma senha - Entre no channel `be-mean-instagram`",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "pr": "node teste.js"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises/issues"
  },
  "homepage": "https://github.com/sergiokopplin/be-mean-instagram-nodejs-exercises#readme",
  "dependencies": {
    "lodash": "^4.3.0"
  },
  "devDependencies": {
    "gulp": "^3.9.1"
  },
  "optionalDependencies": {
    "mongoose": "^4.4.3"
  }
}
```

```teste.js
console.log(__dirname);
```

```
npm run pr

> be-mean-exercises@1.0.0 pr /Users/kopplin/Desktop/be-mean-exercises
> node teste.js

/Users/kopplin/Desktop/be-mean-exercises
```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.
```JS
__dirname
console.log(__dirname);

__filename
console.log(__filename);

Buffer
var buff = new Buffer('Hello World!');
console.log(buff.toString());

setTimeout
setTimeout(function(){
    console.log("esse vem com atraso de 1s");
}, 1000);

setInterval
setInterval(() => console.log("intervalo de 1s"), 1000);
```

## Explique como funciona e de um exemplo de `process`.
O process é uma instância do EventEmitter, portanto emite eventos.

```JS
process.on('uncaughtException', (err) => {
  console.log(`Caught exception: ${err}`);
});
```
---

Aula 05 - Parte 2

## Criar um arquivo
```JS
var fs = require('fs');

fs.writeFile('teste.txt', 'Esse é o conteúdo do arquivo', function (err){
    if(err) throw err;
    console.log('Arquivo salvo');
});
```

```
$ cat teste.txt
Esse é o conteúdo do arquivo%
```

## Ler um arquivo
```JS
var fs = require('fs');

fs.readFile('teste.txt', 'utf8' ,function (err, data){
    if(err) throw err;
    console.log(data);
});
```

```
node read-file.js
Esse é o conteúdo do arquivo
```

## Editar conteúdo desse arquivo
```JS
var fs = require('fs');

var texto = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

fs.writeFile('teste.txt', texto ,function (err, data){
    if(err) throw err;
    console.log('Arquivo alterado!');
});
```

```
node edit-file.js
Arquivo alterado!
```

## Deletar arquivo
```JS
var fs = require('fs');

fs.unlink('teste.txt', function (err){
    if(err) throw err;
    console.log('Arquivo deletado');
});
```

```
node delete-file.js
Arquivo deletado
```

## Renomear o arquivo
```JS
var fs = require('fs');

fs.rename('teste.txt', 'novo-nome.txt', function (err){
    if(err) throw err;
    console.log('Arquivo alterado');
});
```

```
node rename-file.js
Arquivo alterado
```

##Desafio: Criar um servidor web de arquivos estáticos: .css, .html, .js e etc...

```JS
var http = require('http')
    , fs = require('fs');

http.createServer(function(request, response){
    var contentType;

    switch (request.url) {

        case '/index.html':
            contentType = 'text/html';
            break;

        case '/style.css':
            contentType = 'text/css';
            break;

        case '/server.js':
            contentType = 'text/javascript';
            break;

        default:
            response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
            response.write('<h1>404 - O arquivo não existe</h1>');
            break;
    }

    fs.readFile(request.url.substring(1), 'utf8', function (err, data){
        if (err) {
            console.log(err);
            return false;
        }
        response.writeHead(200, { 'Content-Type': contentType });
        response.end(data);
    });
}).listen(3000, function(){
    console.log('Servidor rodando em localhost:3000');
});
```

repo_language: JavaScript

mime_type: text/plain


text:
# Node.js - Aula 05 - Exercício
**user:** [filipe1309](https://github.com/filipe1309)
**autor:** Filipe Leuch Bonfim

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0
#### NVM
```
sudo npm install -g nvm
nvm install 5.4.0
nvm use 5.4.0
nvm alias default 5.4.0
```

## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:

```
npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (projeto_ex2)
version: (1.0.0) 0.0.1
description: Projeto criado para o exercicio 2 da aula 5 de Node.js
entry point: (index.js)
test command:
git repository:
keywords: nodejs, bemean, webschool
author: Filipe Leuch Bonfim
license: (ISC)
About to write to /home/filipe1309/devel/be_mean/be-mean-modulo-nodejs/src/class05/projeto_ex2/package.json:
```
```js
{
  "name": "projeto_ex2",
  "version": "0.0.1",
  "description": "Projeto criado para o exercicio 2 da aula 5 de Node.js",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "nodejs",
    "bemean",
    "webschool"
  ],
  "author": "Filipe Leuch Bonfim",
  "license": "ISC"
}
```

#### 1 dependência local
##### Comando
```
npm i --save bower
```
##### package.json
```js
"dependencies": {
  "bower": "^1.7.7"
},
```

#### 1 dependência local de desenvolvimento
##### Comando
```
npm i --save-dev socket.io
```
##### package.json
```js
"devDependencies": {
  "socket.io": "^1.4.5"
},
```

#### 1 dependência local opcional
##### Comando
```
npm i --save-optional mocha
```
##### package.json
```js
"optionalDependencies": {
  "mocha": "^2.4.5"
}
```

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.
#### script_npm_run_ex03.js
```js
console.log(__dirname);
```
#### package.json
```js
// ...
"scripts": {
  "path_dir_atual": "node script_npm_run_ex03.js"
},
// ...
```
#### Terminal
```
npm run path_dir_atual

> projeto_ex2@0.0.1 path_dir_atual /home/filipe1309/devel/be_mean/be-mean-modulo-nodejs/src/class05/projeto_ex2
> node script_npm_run_ex03.js

/home/filipe1309/devel/be_mean/be-mean-modulo-nodejs/src/class05/projeto_ex2
```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.
#### console
```js
console.log('hello world');
```

#### process
```js
// Arquitetura do sistema
console.log('This processor architecture is ' + process.arch);
```

#### setInterval(cb, ms)
```js
// a cada 1 segundo retorna "My Interval"
setInterval(() => console.log("My Interval"), 1000);
```

#### setTimeout(cb, ms)
```js
var myTimeOut = setTimeout(() => {
  console.log('My TimeOut');
}, 6000);

// Após 6 segundos retorna "My TimeOut"
myTimeOut
```

#### clearTimeout(t)
```js
var myTimeOut = setTimeout(() => {
  console.log('My TimeOut');
}, 6000);

clearTimeout(myTimeOut);

// não retorna nada
myTimeOut
```

## Explique como funciona e de um exemplo de `process`.
O `process` é um objeto global e uma instancia de `EventEmitter`, que contém diversas funções e propriedades sobre o processo que está rodando o Node.js
Exemplo
```js
// Utilização de memória do Node.js em bytes
console.log(process.memoryUsage());

// Saída
{ rss: 22884352, heapTotal: 7523616, heapUsed: 4001696 }
```

## Criar um arquivo
```js
'use strict';

const fs = require('fs');
fs.writeFile("arquivo.txt", "Hello World!!!", 'utf-8', function(err, result) {
  if(err) throw err;
  console.log('==> Arquivo criado!!!');
});

// Saída
//==> Arquivo criado!!!
```

## Ler um arquivo
```js
'use strict';

const fs = require('fs');
fs.readFile("arquivo.txt", 'utf-8', function(err, result) {
  if(err) throw err;
  console.log('==> Arquivo lido: ', result);
});

// Saída
//==> Arquivo lido:  Hello World!!!
```

## Editar conteúdo desse arquivo
```js
'use strict';

const fs = require('fs');

fs.readFile("arquivo.txt", 'utf-8', function(err, result){
  if (err) throw err;

  var conteudo_editado = result + " - Editado!!!";
  fs.writeFile("arquivo.txt" ,conteudo_editado, "utf-8", function (err) {
    if (err) throw err;
    console.log("==> Arquivo editado!!!");
  });
});

// Saída
// ==> Arquivo editado!!!
```

## Deletar arquivo
```js
'use strict';

const fs = require('fs');

fs.unlink("arquivo_renomeado.txt", function(err){
  if (err) throw err;
  console.log("==> Arquivo removido!!!");
});

// Saída
// ==> Arquivo removido!!!
```

## Renomear o arquivo
```js
'use strict';

const fs = require('fs');

fs.rename("arquivo.txt", "arquivo_renomeado.txt", function(err){
  if(err) throw err;
  console.log("==> Arquivo renomeado!!!");
})

// Saída
// ==> Arquivo renomeado!!!
```

## Desafio
Criar um servidor web de arquivos estáticos: .css, .html, .js e etc... UTILIZANDO SOMENTE fs E http

```js
'use strict';

  const http = require('http')
    , fs = require('fs')
    ;

    http.createServer(function(req, res){
      var responseStatusCode = 200
      , file_req = req.url
      , ext = file_req.split(".").pop().toLowerCase()
      , cType = 'text/html;charset=utf8'
      , dir
      ;

      // Redireciona para index, caso não seja informada nenhma rota
      if (file_req === '/') {
        ext = 'html';
        file_req += 'index.' + ext;
      }

      /*
      A priori, os arquivos estão em pastas com o nome das extensões,
      a não ser no caso de imagens que está na pasta img.
      */
      dir = ext;

      // Define o mimetype adequado para o arquivo solicitado
      switch (ext) {
        case 'html':
          break;
        case 'css':
          cType = 'text/css';
          break;
        case 'js':
          cType = 'text/javascript';
          break;
        case 'jpeg':
        case 'jpg':
          cType = 'image/jpeg';
          dir = 'img';
          break;
        case 'png':
          cType = 'image/png';
          dir = 'img';
          break;
        case 'gif':
          cType = 'image/gif';
          dir = 'img';
          break;
        default:
          responseStatusCode = 404;
          break;
      }

      // Define o cabeçalho de resposta
      res.writeHead(responseStatusCode, {'Content-Type': cType});

      // Ajusta o path, incluido a pasta do arquivo requisitado
      var path_file_req = dir+file_req;

      try{
        /*
        Caso um diretório de arquivos (css, html, js, img) seja informado,
        caso exista, os arquivos daquele diretório serão listados
        */
        if (ext.substring(0, 1) == '/') {
          dir = ext.substring(1);
          fs.accessSync( dir, fs.R_OK );
          if( fs.lstatSync(dir).isDirectory() ){
            var dir_files = fs.readdirSync(dir);
            dir_files.forEach(dir_file => {
               res.write('<a href="' + dir_file + '">' + dir_file + '</a><br>' );
            });
          }
        } else {
          /*
          Caso um arquivo (css, html, js, jpg, jpeg) seja informado,
          caso exista, o mesmo é exibido diretamente na página
          */
          // Verifica se o arquivo existe
          fs.accessSync( path_file_req, fs.R_OK );

          // le o arquivo
          var file_server = fs.readFileSync(path_file_req);

          // Escreve o conteudo do arquivo no response
          res.write(file_server);
        }
       } catch(e){
         var file_error = fs.readFileSync('html/not_found.html');
         res.write(file_error);
       }

      console.log("file: ", file_req);
      console.log("ext: ", ext);
      console.log("cType: ", cType);

      // Envia response
      res.end();
    }).listen(3000, function(){
      console.log('Servidor rodando em localhost:3000');
    });
```
#### [index] `localhost:3000/`
!['index'](https://github.com/filipe1309/be-mean-modulo-nodejs/blob/master/src/class05/desafio/img/index_printscreen.png)

#### [Arquivo] `localhost:3000/main.css`
!['main.css'](https://github.com/filipe1309/be-mean-modulo-nodejs/blob/master/src/class05/desafio/img/file_main_css_printscreen.png)

#### [404] `localhost:3000/non_ecziste`
!['Not found'](https://github.com/filipe1309/be-mean-modulo-nodejs/blob/master/src/class05/desafio/img/not_found_printscreen.png)

#### [Diretório] `localhost:3000/css`
!['dir css'](https://github.com/filipe1309/be-mean-modulo-nodejs/blob/master/src/class05/desafio/img/dir_css_printscreen.png)


text:
# Node.js - Aula 05 - Exercício
**User:** [daniofilho](https://github.com/daniofilho)

**Autor:** Dânio Filho

**Date:** 1453236237757

# Exercício npm

**1.** Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.

~~~ terminal
> npm -v
3.3.12
> node -v
v5.4.0
~~~

**2.**  Inicie um projeto novo para esse exercício, com o **npm** e instale, salvando no **package.json**:
   - 1 dependência local
   - 1 dependência local de desenvolvimento
   - 1 dependência local opcional

~~~ json
{
  "name": "daniofilho-node-exercicio-05",
  "version": "1.0.0",
  "description": "Exercício Node - Aula 05",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "ex03": "node script.js"
  },
  "keywords": [
    "node",
    "exercicio",
    "webschool"
  ],
  "author": "Dânio Filho",
  "license": "ISC",
  "dependencies": {
    "mongoose": "^4.3.6"
  },
  "devDependencies": {
    "jasmine": "^2.4.1"
  },
  "optionalDependencies": {
    "colors": "^1.1.2"
  }
}
~~~

**3.** Crie e execute um script, via **npm**, que mostre uma mensagem no console com global, que possui caminho para o diretório atual.

~~~ js
//script.js
   console.log(__dirname);
~~~

`npm run ex03`

~~~ js
//retorno
> daniofilho-node-exercicio-05@1.0.0 ex03 /Users/daniofilho/Dropbox/Estudo/Be MEAN/02 - NodeJS/aula-05/exercicio
> node script.js

/Users/daniofilho/Dropbox/Estudo/Be MEAN/02 - NodeJS/aula-05/exercicio
~~~

**4.** Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

**console**

Usado para printar mensagens no terminal.

~~~ js
console.log( 'Usando o Global console.' );
~~~

**require**

Usado para chamar módulos do Node.

~~~ js
require('http');
~~~

**setInterval**

Usado para executar uma função a cada "x" milisegundos.

~~~ js
setInterval(() => {
   console.log(Date.now());
}, 1000);
~~~

**__dirname**

Retorna o caminho do diretório atual.

~~~ js
console.log(__dirname);
~~~

**__filename**

Retorna o caminho do arquivo atual.

~~~ js
console.log(__filename);
~~~

**5.** Explique como funciona e dê um exemplo de *process*

**process** é um módulo global do Node que transmite eventos, ou seja, toda vez que queremos executar qualquer ação quando um evento ocorrer, usamos o process.

Um exemplo é mostrar uma mensagem para o usuário ao finalizar uma sessão no terminal:

~~~ js
'use strict'

//código...

process.on('SIGINIT', () => {
   console.log('saindo...');//mostra a mensagem antes de sair
   process.exit(0);//finaliza o processo
});
~~~

# Exercício FileSystem

- Criar um arquivo
- Ler um arquivo
- Editar o conteúdo desse arquivo
- renomear arquivo
- deletar arquivo

~~~ js
'use strict'

var fs = require('fs');
let now = Date.now();
let fileTxt = './' + now + '.txt';

console.log('#debug: Date.now() => ', now);

//Cria o arquivo
fs.writeFile(fileTxt, 'Date.now(): ' + now , (err) => {
   if (err) throw err;
   console.log('Arquivo criado');
},()=> {

   //Lê
   fs.readFile(fileTxt, 'utf8', (err, data) => {
      if(err) throw err;
   },()=> {

      //Edita o conteúdo
      fs.readFile(fileTxt, 'utf-8', (err, data) => {
         if (err) throw err;
         var alterado = data + "\nNovo conteúdo.";

         fs.writeFile(fileTxt, alterado, 'utf-8', function (err) {
            if (err) throw err;
         },()=> {

            //Renomeia o arquivo
            fs.rename(fileTxt,'./fuirenomeado.txt', (err, data) => {
               if(err) throw err;
            },()=> {

               //Deleta o arquivo
               fs.unlink('./fuirenomeado.txt', (err) => {
                  if(err) throw err;
               });//unlink

            });//rename

         });//writeFile

      });//readFile

   });//readFile

});//writeFile
~~~

# desafio: criar um servidor web de arquivos estáticos: .css, .html, .js e etc...

**Arquivos usados no exercício foram gerados via [Initializr](http://www.initializr.com)**

**Servidor Node**

~~~ js
var http = require("http");
var fs = require("fs");
var path = require("path");

http.createServer(function(request, response){

   //Dependendo do tipo de arquivo, retorna um content type diferente
   var filePath = "/site" + request.url;
   if (filePath == '/site/')
     filePath = '/site/index.html';

   filePath    = __dirname + filePath;
   var extname = path.extname(filePath);
   var contentType = 'text/html';

   //Debug
   console.log( "url: ", request.url );
   console.log( "arquivo: ", filePath );
   console.log( " - - - - - ");

   //Verifica os tipos de arquivo
   switch ( extname.toLowerCase() ) {
      case '.js':
         contentType = 'text/javascript';
         break;
      case '.css':
         contentType = 'text/css';
         break;
      case '.jpg':
      case '.jpeg':
         contentType = 'image/jpeg';
         break;
      case '.png':
         contentType = 'image/png';
         break;
      case '.gif':
         contentType = 'image/gif';
         break;
   }

   //Retorna o arquivo
   fs.readFile(filePath, function(err, content) {
      if (err) {
         response.writeHead(500);
         response.end();
      } else {
         response.writeHead(200, { 'Content-Type': contentType });
         response.end(content, 'utf-8');
      }
   });

}).listen(3000, function(){
   console.log('Servidor rodando em localhost:3000');
});

~~~

**Print do navegador **

![](http://daniofilho.github.io/assets/media/desafio-servidor-web.jpg)


text:
# Node.js - Aula 05 - Exercício

**user:** [Geriel Castro](https://github.com/geriel)

**autor:** Geriel Castro

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0

Baixei o [NVM](https://github.com/creationix/nvm) , peguei a referencia desse site desconhecido aqui [NomaDev](http://nomadev.com.br/node-js-o-que-%C3%A9-nvm-e-como-gerenciar-vers%C3%B5es-do-node/)

```js
node -v v5.8.0
```

## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:
```js

npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (new-project)
version: (1.0.0)
description: Novo Projeto usando npm init aula5 exercicio
entry point: (index.js)
test command:
git repository:
keywords: mongodb, nodejs
author: Geriel Castro
license: (ISC)
About to write to /Applications/XAMPP/xamppfiles/htdocs/estudo/estudos/workshop-be-mean/nodejs/aula5/new-project/package.json:

{
  "name": "new-project",
  "version": "1.0.0",
  "description": "Novo Projeto usando npm init aula5 exercicio",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "mongodb",
    "nodejs"
  ],
  "author": "Geriel Castro",
  "license": "ISC"
}
```

* 1 dependência local:
  `npm i --save socket.io`

* 1 dependência local de desenvolvimento:
  `npm i --save--dev grunt`

* 1 dependência local opcional:
  `npm i colors --save-optional`

**Arquivo package.json atualizado**
```js
{
  "name": "new-project",
  "version": "1.0.0",
  "description": "Novo Projeto usando npm init aula5 exercicio",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "mongodb",
    "nodejs"
  ],
  "author": "Geriel Castro",
  "license": "ISC",
  "dependencies": {
    "socket.io": "^1.4.5"
  },
  "devDependencies": {
    "grunt": "^1.0.1"
  },
  "optionalDependencies": {
    "colors": "^1.1.2"
  }
}
```

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.
**app.js**
```js
console.log('Diretorio: ', __dirname);
```

**package.json**
```js
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "getdir": "node app.js"
  }
```

**npm run**
```js
npm run getdir

> new-project@1.0.0 getdir /Applications/XAMPP/xamppfiles/htdocs/estudo/estudos/workshop-be-mean/nodejs/aula5/new-project
> node app.js

Diretorio:  /Applications/XAMPP/xamppfiles/htdocs/estudo/estudos/workshop-be-mean/nodejs/aula5/new-project

```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

1. `__dirname` retorna o diretório que o script está sendo executado.
  ```js
  console.log(__dirname);
  ```

## Explique como funciona e de um exemplo de `process`.


text:
# Node.js - Aula 05 - Exercício

**user:** [carloshenriqueribeiro](https://github.com/carloshenriqueribeiro)

**autor:** Carlos Henrique Ribeiro

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0

> npm -v
4.1.2

## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:

	* 1 dependência local
	* 1 dependência local de desenvolvimento
	* 1 dependência local opcional

´´´
> mkdir newproject
> cd newproject
> npm init
> cat package.json
{
  "name": "loveproject",
  "version": "1.0.1",
  "description": "love project transmit love!",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Carlos Henrique Ribeiro\u001b[1;6D\u001b[1;6D\u001b[1;6D\u001b[1;6D\u001b[1;6D\u001b[1;6D\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[itos",
  "license": "ISC"
}
´´´

´´´
> npm i -S bower
> npm i -S -D broserify
> npm i -S -O grunt-cli
´´´

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

> mkdir global
> cd global
> npm init
* Editei o package.json, adicionando o global.js como script.

´´´js
global.js
'use strict';

console.log(__dirname);
´´´
> cat package.json
{
  "name": "global",
  "version": "1.0.0",
  "description": "Imprime a variavel Global de caminh absoluto da pasta raiz",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "global" : "node global.js"
  },
  "keywords": [
    "global",
    "webschool"
  ],
  "author": "Carlos Henrique Ribeiro",
  "license": "MIT"
}

> npm run global
/users/chori/be-mean/nodejs/npm/global

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

__dirname
Retorna o diretório atual

console.log(__dirname);

__filename
Retorna o nome do arquivo (caminho absoluto) que iniciou esta execução

console.log(__filename);

clearInterval(t)
Finaliza um timer que foi criado com setInterval().

var interval = setInterval(function(){ timer()}, 1000);
clearInterval(interval);

clearTimeout(t)
Finaliza um timer que foi criado com setTimeOut().

var interval = setTimeOut(function(){ timer()}, 1000);
clearTimeout(interval);

setTimeOut()
Chama uma função ou valida uma expresão depois de um numero especificado de milisegundos.

setTimeout(function(){ alert("Hello"); }, 3000);

## Explique como funciona e de um exemplo de `process`.

Process é utilizado para manipular processos do sistema operacional. Por ser global, não necessita de require. Com ele podemos:

 * Matar (Kill) um processo do SO.
 * Descobrir o path de execução do Node.
 * Saber a memória utilizada pelo Node
 * ETC

## Criar um arquivo

'use strict';

var fs = require('fs');
var write = fs.writeFileSync("./teste.txt", "Eu foi criado com FS do Node.js");

## Ler um arquivo

'use strict';

var fs = require('fs');

fs.readFile('./teste.txt', 'utf8', function(err, data){
	if (err) throw err;
	console.log(data);
});

## Editar conteúdo desse arquivo

'use strict';

var fs = require('fs');

fs.appendFile('./teste.txt', '. Adicionando conteúdo via FS.', 'utf8', function(err, data){
	if (err) throw err;
	console.log(data);
});

## Deletar arquivo

'use strict';

var fs = require('fs');

fs.unlink('./teste.txt', function(err, data){
	if (err) throw err;
	console.log("Arquivo deletado");
});

## Renomear o arquivo

'use strict';

var fs = require('fs');

fs.rename('./teste.txt', './teste2.txt', function(err, result){
	if (err) throw err;
	console.log(result);
});


text:
# Node.js - Aula 05 - Exercício
**user:** [Pauloxt1](https://github.com/Pauloxt1)

**autor:** Paulo Roberto

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0
```shell
paulo@Paulo:~/workshop-be-mean/nodejs/mongoose$ sudo npm install -g n
/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
/usr/local/lib
└── n@2.1.0
```
```shell
paulo@Paulo:~/workshop-be-mean/nodejs/mongoose$ n
    ο node/5.4.1
```
## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:
```shell
paulo@Paulo:~/workshop-be-mean/nodejs/aula5/exerc$ npm init
About to write to /home/paulo/workshop-be-mean/nodejs/aula5/exerc/package.json:

{
  "name": "exercicio5",
  "version": "1.0.0",
  "description": "Exercicio da aula 5",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "webschool",
    "exercicio",
    "aula5"
  ],
  "author": "Paulo Roberto",
  "license": "MIT"
}
```

- 1 dependência local
```shell
paulo@Paulo:~/workshop-be-mean/nodejs/aula5/exerc$ npm i -S mongoose
```
- 1 dependência local de desenvolvimento
```shell
paulo@Paulo:~/workshop-be-mean/nodejs/aula5/exerc$ npm install -SD n
```
- 1 dependência local opcional
```shell
npm install -SO color
```
## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.
```js
// filename: show_directory.js
console.log(__dirname);
```

```js
// package.json
  "scripts":{
    "ondeuto": "node show_directory.js"
  }
```

```shell
paulo@Paulo:~/workshop-be-mean/nodejs/aula5/exerc$ npm run ondeuto

> exercicio5@1.0.0 ondeuto /home/paulo/workshop-be-mean/nodejs/aula5/exerc
> node show_directory.js

/home/paulo/workshop-be-mean/nodejs/aula5/exerc
```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

```js
console.log(__dirname);
```

```js
console.log(__filename);
```

```js
'use strict';
var interval = setInterval(()=>{
	console.log('Batata');
}, 2000);
```

```js
clearInterval(interval);
```

```js
setTimeout(()=>{
	console.log('zeus');
}, 1000);
```

## Explique como funciona e de um exemplo de `process`.
É um objeto global que manipula eventos.
```js
// filename: process.js
'use strict';

process.on('uncaughtException', (err) => {
  console.log('Ocorreu um erro desconhecido');
});

naoExisteFunc();
```

```shell
paulo@Paulo:~/workshop-be-mean/nodejs/aula5/exerc$ node process.js
Ocorreu um erro desconhecido
```

## File System

### Criar um arquivo.
```js
// file: createFile
const fs = require('fs');
fs.writeFile('./novoArquivo.txt', '', function(err, result){
	if(err) throw err;
	console.log(result);
});
```

```js
paulo@Paulo:~/workshop-be-mean/nodejs/4$ node createFile.js
undefined
```

### Ler um arquivo.
```js
// file: readFile.js
const fs = require('fs');
fs.readFile('./novoArquivo.txt', 'utf-8', function(err, data){
	console.log(data);
});
```

```js
paulo@Paulo:~/workshop-be-mean/nodejs/4$ node readFile.js

```
### Editar conteúdo desse arquivo.
```js
// file: updateFile.js
const fs = require('fs');
fs.writeFile('./novoArquivo.txt', 'Update file', function(err, result){
    if(err) throw err;
    console.log(result);
});
```
```js
paulo@Paulo:~/workshop-be-mean/nodejs/4$ node updateFile.js
undefined
```
### Deletar arquivo.
```js
// file: deleteFile.js

const fs = require('fs');
fs.unlink('renameFile.txt', function(err){
	if(err) throw err;
	console.log('Deletado com sucesso');
});
```

```js
paulo@Paulo:~/workshop-be-mean/nodejs/4$ node deleteFile.js
Deletado com sucesso
```

### Renomear o arquivo.
```js
// file: renameFile.js
const fs = require('fs');

fs.rename('./novoArquivo.txt', 'renameFile.txt', function(err, result){
	if(err) throw err;
	console.log(result);
});
```
```js
paulo@Paulo:~/workshop-be-mean/nodejs/4$ node renameFile.js
undefined
```

## Desafio: Criar um servidor web de arquivos estáticos.
```js
'use strict';

const http = require('http'),
fs = require('fs'),
port = 3000;

// create directory for files.
try{

	fs.accessSync('files', fs.F_OK);

	}catch (e){

	fs.mkdirSync('files');
}

http.createServer(function(req, res){

		var path = 'files'+req.url;

		try{
			fs.accessSync(path, fs.R_OK);

			if(fs.lstatSync(path).isDirectory()){
				res.writeHeader(200, {"Content-Type": "text/html;charset=utf-8"});
				try{
				var indexPath = path+'/index.html';
				res.write(fs.readFileSync(indexPath, 'utf-8'));
				}catch(e){
					var files = fs.readdirSync(path);
					files.forEach(nome =>{
						res.write('<a href="'+req.url+'/'+nome+'">'+nome+'</a><br>');
					});
				}

			}else{
				var typeFile = path.split(".");
				switch(typeFile[typeFile.length-1]){
					case 'css':
					res.writeHeader(200, {"Content-Type": "text/css"});
					break;
					case 'html':
					res.writeHeader(200, {"Content-Type": "text/html;charset=utf-8"});
					break;
					case 'jpg':
					res.writeHeader(200, {"Content-Type": "image/jpeg"});
					break;
					case 'png':
					res.writeHeader(200, {"Content-Type": "image/png"});
					break;
					case 'gif':
					res.writeHeader(200, {"Content-Type": "image/gif"});
					break;

				}
				res.write(fs.readFileSync(path));
			}
		} catch(e){
			res.writeHeader(404, {"Content-Type": "text/html;charset=utf-8"});
			res.write('Página não encontrada');
		}

		res.end();

}).listen(port, () => {
	console.log('Servidor levantado na porta '+port);
});
```
Acessando servidor levantado:
!['Index'](http://i.imgur.com/nG2FrDW.png)

Acessando diretório:
!['diretório'](http://i.imgur.com/s7AbvgR.png)

Acessando local inexistente:
!['diretório'](http://i.imgur.com/VHAaTLQ.png)


text:
# Node.js - Aula 05 - Exercício
**user:** [felipelopesrita](https://github.com/felipelopesrita)
**autor:** Felipe José Lopes Rita

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0
O gerenciado instalado foi o *n*
```js
 ➡ sudo n -V
2.1.0
 ➡ node -v
v5.6.0
```

## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:
```js
 npm init
 npm i --save mongoose
 npm i --save-dev jasmine
 npm i --optional colors
 cat package.json
   {
     "name": "ex05",
     "version": "1.0.0",
     "description": "Exercício 05",
     "main": "index.js",
     "scripts": {
       "test": "echo \"Error: no test specified\" && exit 1"
     },
     "author": "Felipe",
     "license": "ISC",
     "dependencies": {
       "mongoose": "^4.4.5"
     },
     "devDependencies": {
       "jasmine": "^2.4.1"
     },
     "optionalDependencies": {
       "color": "^0.11.1",
       "colors": "^1.1.2"
     }
   }
```

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.
```js
 ➡ npm start

> ex05@1.0.0 start /home/felipe/Documentos/myRepo/Workshop-be-mean/nodejs/exercises/ex05
> node script.js

/home/felipe/Documentos/myRepo/Workshop-be-mean/nodejs/exercises/ex05
```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.
*console*
```js
//Usado para exibir mensagens no console
console.log('JS é vida');
//Saída: JS é vida
```
*filename*
```js
console.log(__filename);
//Saída: /home/felipe/Documentos/myRepo/Workshop-be-mean/nodejs/exercises/ex05/script.js
```
*process*
```js
process.on('exit', (code) => {
  console.log('O processo terminou com o código: ', code);
  //Saída: O processo terminou com o código:  0
});
```
*dirname*
```js
console.log(__dirname);
//Saída: /home/felipe/Documentos/myRepo/Workshop-be-mean/nodejs/exercises/ex05
```
*setTimeOut*
```js
setTimeOut(()=>{
  console.log('Esse texto só será exibido depois de 5 segundos');
}, 5000);
```

## Explique como funciona e de um exemplo de `process`.
É a instancia global do EventEmitter, que controla todas os eventos do Node e pode ser acessado em qualquer trecho do código. Atráves dele, é possível controlar os eventos disparados durante toda a execução do código, como a detecção de erros ou o encerramento do código.
```js
process.on('uncaughtException', (err) => {
  console.log(`Algo de errado não está certo: ${err}`);
});
```

## Criar um arquivo
```js
'use strict';
var fs = require('fs');
var write = fs.writeFileSync('./ex05.txt', 'Hello World!', 'utf8');
```

## Ler um arquivo
```
'use strict';
var fs = require('fs');
fs.readFile(path, options, callback_);('./ex05.txt', 'utf8', (err, result)=>{
	if(err) throw err;
	console.log(result);
});
```

## Editar conteúdo desse arquivo
```js
'use strict';
var fs = require('fs');
fs.writeFile('./ex05.txt', 'Daqui a pouco já vai ser excluido', 'utf8', (err, result)=>{
	if(err) throw err;
	console.log(result);
});
```

## Renomear o arquivo
```js
'use strict';
var fs = require('fs');
fs.rename('./ex05.txt', './renomeia.txt', err=>{
	if(err) throw err;
	console.log('Arquivo renomeado :)');
});
```

## Deletar arquivo
```js
'use strict';
var fs = require('fs');
fs.unlink('./renomeia.txt', (err)=>{
	if(err) throw err;
	console.log('Arquivo excluído :)');
});
```

## Desafio
```js
'use strict';

var http = require('http')
  , fs   = require('fs')
  ;

http.createServer((req, res)=>{

	/* Verifica se a requisição é na origem. Se nã0 for, busca pelo arquivo */
	if( req.url!=="/" ) {

		var url = "." + req.url;
		fs.readFile(url, (err, data)=>{

			if(err) {
				res.writeHead(404, {'Content-Type': 'text/html'});
				res.write('<h2 style="font-family: Arial"> 404 :( </h2>');
				res.end();
			} else {
				var type = 'text/' + url.match(/[^\.]+$/g);
				res.writeHead(200, {'Content-Type': type});
				res.write(data);
				res.end();
			}

		});

	} else {

		res.writeHead(200, {'Content-Type': 'text/html'});
		var html = fs.readFileSync('./index.html', 'utf8');
		res.write(html);
		res.end();
	}

}).listen(3000, ()=>{
	console.log('Aplicação rodando em localhost:3000')
});
```

**Servidor Web (200:OK)**
![Servidor Rodando](http://i.imgur.com/N1UQCiP.png)

**404**
![404 Status](http://i.imgur.com/sg0oeEg.png)


text:
# Node.js - Aula 05 - Exercício
**user:** [vitorcapretz](https://github.com/vitorcapretz)

**autor:** Vitor Capretz

**date:** 1465951250011

## 1. Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0

#### Instalação do `nvm` via cUrl
```
vitor@vitor-ThinkPad-T440:/var/www/html/be-mean-modulo-nodejs$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
```
#### Checando a instalação
```
vitor@vitor-ThinkPad-T440:~$ command -v nvm
nvm
```
#### Versão do `nvm`
```
vitor@vitor-ThinkPad-T440:~$ nvm --version
0.31.1
```

#### Versão do node, não há necessidade de atualização por ser a última
```
vitor@vitor-ThinkPad-T440:~$ node --version
v6.2.1
```

## 2. Inicie um projeto novo para essa aula, com o npm e instale, salvando no `package.json`
```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/proj-bemean$ npm init
```

#### Arquivo package.json finalizado
```js
{
  "name": "proj-bemean",
  "version": "0.0.1",
  "description": "projeto do bemean aula 05",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "vitorcapretz",
  "license": "ISC"
}
```

#### Instalando dependência local
```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/proj-bemean$ npm i --save bower
proj-bemean@0.0.1 /var/www/html/workshop-be-mean/nodejs/proj-bemean
└── bower@1.7.9

npm WARN proj-bemean@0.0.1 No repository field.
```

#### Instalando dependência de desenvolvimento
```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/proj-bemean$ npm i --save-dev socket.io
proj-bemean@0.0.1 /var/www/html/workshop-be-mean/nodejs/proj-bemean
└─┬ socket.io@1.4.6
  ├─┬ debug@2.2.0
  │ └── ms@0.7.1
  ├─┬ engine.io@1.6.9
  │ ├─┬ accepts@1.1.4
  │ │ ├─┬ mime-types@2.0.14
  │ │ │ └── mime-db@1.12.0
  │ │ └── negotiator@0.4.9
  │ ├── base64id@0.1.0
  │ ├─┬ engine.io-parser@1.2.4
  │ │ ├── after@0.8.1
  │ │ ├── arraybuffer.slice@0.0.6
  │ │ ├── base64-arraybuffer@0.1.2
  │ │ ├── blob@0.0.4
  │ │ ├── has-binary@0.1.6
  │ │ └── utf8@2.1.0
  │ └─┬ ws@1.0.1
  │   ├── options@0.0.6
  │   └── ultron@1.0.2
  ├─┬ has-binary@0.1.7
  │ └── isarray@0.0.1
  ├─┬ socket.io-adapter@0.4.0
  │ └─┬ socket.io-parser@2.2.2
  │   ├── debug@0.7.4
  │   └── json3@3.2.6
  ├─┬ socket.io-client@1.4.6
  │ ├── backo2@1.0.2
  │ ├── component-bind@1.0.0
  │ ├── component-emitter@1.2.0
  │ ├─┬ engine.io-client@1.6.9
  │ │ ├── component-inherit@0.0.3
  │ │ ├── has-cors@1.1.0
  │ │ ├── parsejson@0.0.1
  │ │ ├── parseqs@0.0.2
  │ │ ├── xmlhttprequest-ssl@1.5.1
  │ │ └── yeast@0.1.2
  │ ├── indexof@0.0.1
  │ ├── object-component@0.0.3
  │ ├─┬ parseuri@0.0.4
  │ │ └─┬ better-assert@1.0.2
  │ │   └── callsite@1.0.0
  │ └── to-array@0.1.4
  └─┬ socket.io-parser@2.2.6
    ├── benchmark@1.0.0
    ├── component-emitter@1.1.2
    └── json3@3.3.2

npm WARN proj-bemean@0.0.1 No repository field.
```
#### Dependência opcional
```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/proj-bemean$ npm i --save-optional mocha
npm WARN deprecated jade@0.26.3: Jade has been renamed to pug, please install the latest version of pug instead of jade
npm WARN deprecated minimatch@0.3.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
proj-bemean@0.0.1 /var/www/html/workshop-be-mean/nodejs/proj-bemean
└─┬ mocha@2.5.3
  ├── commander@2.3.0
  ├── diff@1.4.0
  ├── escape-string-regexp@1.0.2
  ├─┬ glob@3.2.11
  │ ├── inherits@2.0.1
  │ └─┬ minimatch@0.3.0
  │   ├── lru-cache@2.7.3
  │   └── sigmund@1.0.1
  ├── growl@1.9.2
  ├─┬ jade@0.26.3
  │ ├── commander@0.6.1
  │ └── mkdirp@0.3.0
  ├─┬ mkdirp@0.5.1
  │ └── minimist@0.0.8
  ├── supports-color@1.2.0
  └── to-iso-string@0.0.2

npm WARN proj-bemean@0.0.1 No repository field.
```

**Arquivo `package.json após dependências**
```js
{
  "name": "proj-bemean",
  "version": "0.0.4",
  "description": "projeto do bemean aula 05",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "ScriptJs": "node server.js"
  },
  "author": "vitorcapretz",
  "license": "ISC",
  "dependencies": {
    "bower": "^1.7.9"
  },
  "devDependencies": {
    "socket.io": "^1.4.6"
  },
  "optionalDependencies": {
    "mocha": "^2.5.3"
  }
}
```

## 3. Crie e execute um script, via npm, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

#### Arquivo `package.json` atualizado
```js
{
  "name": "proj-bemean",
  "version": "0.0.1",
  "description": "projeto do bemean aula 05",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "ScriptJs": "node server.js"
  },
  "author": "vitorcapretz",
  "license": "ISC"
}
```

#### Arquivo `server.js`
```js
console.log(__dirname);
```

#### Resultado no terminal
```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/proj-bemean$ npm run ScriptJs

> proj-bemean@0.0.1 ScriptJs /var/www/html/workshop-be-mean/nodejs/proj-bemean
> node server.js

/var/www/html/workshop-be-mean/nodejs/proj-bemean
```

## 4. Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

#### dirname e filename

Ambas são muito parecidas, a variável global `__dirname` retorna o caminho completo do diretório, enquanto a variável `__filename` inclui também o nome do próprio arquivo.

```js
console.log(__dirname); // /var/www/html/workshop-be-mean/nodejs/proj-bemean
console.log(__filename); // /var/www/html/workshop-be-mean/nodejs/proj-bemean/server.js
```
#### setInterval e setTimeout

Também muito semelhantes, ambas recebem uma função de callback e um tempo em milisegundos. A diferença é que `setInterval` executa a função callback infinitamente a cada X milisegundos passados como parâmetro, enquanto a `setTimeout` aguarda por X milisegundos e executa a função callback apenas uma vez.

```js
'use strict';

const interval = setInterval(() => {
    console.log('loop');
}, 500);

setTimeout(() => {
    clearInterval(interval);
    console.log('stopped infinite loop');
}, 5000);
```

#### console

Conhecido principalmente por permitir a impressão de dados, um de seus métodos muito utilizados é o `console.log`

```js
console.log('just a print');
```

#### Buffer - classe

Usado para lidar com dados binários

```js
'use strict';

const buf = new Buffer(10);
console.log(buf); // <Buffer 00 00 00 00 00 00 00 00 a0 6b>
```

## 5. Explique como funciona e de um exemplo de `process`.

O `process` é uma váriavel global que disponibiliza ao desenvolvedor informações sobre o atual estado da aplicação.

O objeto `process` é uma instância do `EventEmitter`.

**Exemplo de impressão de uso de memória**
```js
console.log(process.memoryUsage()); // { rss: 23867392, heapTotal: 8384512, heapUsed: 4230040 }
```

## 6. Gerenciamento de arquivos usando FileSystem: Criar, Ler, Editar, Renomear e Deletar

```js
"use strict";

const fs = require('fs');
let test_file = "test.txt";

fs.writeFileSync(test_file, 'Olá mundo com teste de criação de arquivo', 'utf8');

console.log('file created');

let file_content = fs.readFileSync(test_file, 'utf8');

console.log(file_content);

fs.writeFileSync(test_file, file_content + ', versão editada', 'utf8');

let new_test_file = "renomeado_" + test_file;
fs.rename(test_file, new_test_file, () => {
    console.log('file renamed');
    fs.unlink(new_test_file, () => {
        console.log('ok, deleted file');
    });
});
```


text:
# Node.js - Aula 04 - Exercício

**user:** [victorvoid](https://github.com/victorvoid)

**autor:** Victor Igor

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0
```js

sudo npm install -g nvm

/usr/bin/nvm -> /usr/lib/node_modules/nvm/bin/nvm
/usr/lib
└─┬ nvm@0.0.3
  └── mkdirp@0.3.5

node -v
v5.4.1

```

## Inicie um projeto novo para essa aula, com o npm e instale, salvando no package.json

```js
/* INICIANDO */
npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (class05) class05
version: (1.0.0)
description: exercitando a aula 05
entry point: (index.js)
test command:
git repository:
keywords: node, npm
author: Victor Igor
license: (ISC)
About to write to /home/victorigor/Área de Trabalho/workshop-be-mean/NodeJS - Be Mean /Arquivos de Exercícios/class05/package.json:

{
  "name": "class05",
  "version": "1.0.0",
  "description": "exercitando a aula 05",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "node",
    "npm"
  ],
  "author": "Victor Igor",
  "license": "ISC"
}

```

- dependência local

```js
 npm i --save yo
npm WARN deprecated npmconf@2.1.2: this package has been reintegrated into npm and is now out of date with respect to npm

> yo@1.7.0 postinstall /home/victorigor/Área de Trabalho/workshop-be-mean/NodeJS - Be Mean /Arquivos de Exercícios/class05/node_modules/yo
> yodoctor

Yeoman Doctor
Running sanity checks on your system

✔ Global configuration file is valid
✔ NODE_PATH matches the npm root
✔ Node.js version
✔ No .bowerrc file in home directory
✔ No .yo-rc.json file in home directory
✔ npm version

Everything looks all right!
class05@1.0.0 /home/victorigor/Área de Trabalho/workshop-be-mean/NodeJS - Be Mean /Arquivos de Exercícios/class05
└─┬ yo@1.7.0
  ├── async@1.5.2
  ├─┬ chalk@1.1.1
  │ ├─┬ ansi-styles@2.2.0
  │ │ └── color-convert@1.0.0
  │ ├── escape-string-regexp@1.0.5
  │ ├── has-ansi@2.0.0
  │ ├── strip-ansi@3.0.1
  │ └── supports-color@2.0.0
  ├── cli-list@0.1.6
  ├─┬ configstore@1.4.0
  │ ├── graceful-fs@4.1.3
  │ ├─┬ mkdirp@0.5.1
  │ │ └── minimist@0.0.8
  │ ├── object-assign@4.0.1
  │ ├── os-tmpdir@1.0.1
  │ ├── osenv@0.1.3
  │ ├── uuid@2.0.1
  │ ├─┬ write-file-atomic@1.1.4
  │ │ ├── imurmurhash@0.1.4
  │ │ └── slide@1.1.6
  │ └── xdg-basedir@2.0.0
  ├─┬ cross-spawn-async@2.1.9
  │ ├─┬ lru-cache@4.0.0
  │ │ ├── pseudomap@1.0.2
  │ │ └── yallist@2.0.0
  │ └─┬ which@1.2.4
  │   ├─┬ is-absolute@0.1.7
  │   │ └── is-relative@0.1.3
  │   └── isexe@1.1.2
  ├── figures@1.4.0
  ├─┬ fullname@2.1.0
  │ ├─┬ npmconf@2.1.2
  │ │ ├─┬ config-chain@1.1.10
  │ │ │ └── proto-list@1.2.4
  │ │ ├── inherits@2.0.1
  │ │ ├── ini@1.3.4
  │ │ ├─┬ nopt@3.0.6
  │ │ │ └── abbrev@1.0.7
  │ │ ├─┬ once@1.3.3
  │ │ │ └── wrappy@1.0.1
  │ │ ├── semver@4.3.6
  │ │ └── uid-number@0.0.5
  │ ├── pify@2.3.0
  │ └─┬ pinkie-promise@2.0.0
  │   └── pinkie@2.0.4
  ├─┬ got@5.5.0
  │ ├─┬ create-error-class@2.0.1
  │ │ └── capture-stack-trace@1.0.0
  │ ├── duplexer2@0.1.4
  │ ├── is-plain-obj@1.1.0
  │ ├── is-redirect@1.0.0
  │ ├── is-retry-allowed@1.0.0
  │ ├── is-stream@1.0.1
  │ ├── lowercase-keys@1.0.0
  │ ├── node-status-codes@1.0.0
  │ ├─┬ parse-json@2.2.0
  │ │ └─┬ error-ex@1.3.0
  │ │   └── is-arrayish@0.2.1
  │ ├── read-all-stream@3.1.0
  │ ├─┬ readable-stream@2.0.5
  │ │ ├── core-util-is@1.0.2
  │ │ ├── isarray@0.0.1
  │ │ ├── process-nextick-args@1.0.6
  │ │ ├── string_decoder@0.10.31
  │ │ └── util-deprecate@1.0.2
  │ ├── timed-out@2.0.0
  │ ├── unzip-response@1.0.0
  │ └─┬ url-parse-lax@1.0.0
  │   └── prepend-http@1.0.3
  ├─┬ humanize-string@1.0.1
  │ └── decamelize@1.2.0
  ├─┬ inquirer@0.11.4
  │ ├── ansi-escapes@1.2.0
  │ ├── ansi-regex@2.0.0
  │ ├─┬ cli-cursor@1.0.2
  │ │ └─┬ restore-cursor@1.0.1
  │ │   └── exit-hook@1.1.1
  │ ├── cli-width@1.1.1
  │ ├─┬ readline2@1.0.1
  │ │ ├── code-point-at@1.0.0
  │ │ ├── is-fullwidth-code-point@1.0.0
  │ │ └── mute-stream@0.0.5
  │ ├── run-async@0.1.0
  │ ├── rx-lite@3.1.2
  │ ├── string-width@1.0.1
  │ └── through@2.3.8
  ├─┬ insight@0.7.0
  │ ├── inquirer@0.10.1
  │ ├─┬ lodash.debounce@3.1.1
  │ │ └── lodash._getnative@3.9.1
  │ ├─┬ os-name@1.0.3
  │ │ ├─┬ osx-release@1.1.0
  │ │ │ └── minimist@1.2.0
  │ │ └─┬ win-release@1.1.1
  │ │   └── semver@5.1.0
  │ ├─┬ request@2.69.0
  │ │ ├── aws-sign2@0.6.0
  │ │ ├── aws4@1.3.2
  │ │ ├── bl@1.0.3
  │ │ ├── caseless@0.11.0
  │ │ ├─┬ combined-stream@1.0.5
  │ │ │ └── delayed-stream@1.0.0
  │ │ ├── extend@3.0.0
  │ │ ├── forever-agent@0.6.1
  │ │ ├── form-data@1.0.0-rc3
  │ │ ├─┬ har-validator@2.0.6
  │ │ │ ├─┬ commander@2.9.0
  │ │ │ │ └── graceful-readlink@1.0.1
  │ │ │ └─┬ is-my-json-valid@2.13.1
  │ │ │   ├── generate-function@2.0.0
  │ │ │   ├─┬ generate-object-property@1.2.0
  │ │ │   │ └── is-property@1.0.2
  │ │ │   └── jsonpointer@2.0.0
  │ │ ├─┬ hawk@3.1.3
  │ │ │ ├── boom@2.10.1
  │ │ │ ├── cryptiles@2.0.5
  │ │ │ ├── hoek@2.16.3
  │ │ │ └── sntp@1.0.9
  │ │ ├─┬ http-signature@1.1.1
  │ │ │ ├── assert-plus@0.2.0
  │ │ │ ├─┬ jsprim@1.2.2
  │ │ │ │ ├── extsprintf@1.0.2
  │ │ │ │ ├── json-schema@0.2.2
  │ │ │ │ └── verror@1.3.6
  │ │ │ └─┬ sshpk@1.7.4
  │ │ │   ├── asn1@0.2.3
  │ │ │   ├─┬ dashdash@1.13.0
  │ │ │   │ └── assert-plus@1.0.0
  │ │ │   ├── ecc-jsbn@0.1.1
  │ │ │   ├── jodid25519@1.0.2
  │ │ │   ├── jsbn@0.1.0
  │ │ │   └── tweetnacl@0.14.1
  │ │ ├── is-typedarray@1.0.0
  │ │ ├── isstream@0.1.2
  │ │ ├── json-stringify-safe@5.0.1
  │ │ ├─┬ mime-types@2.1.10
  │ │ │ └── mime-db@1.22.0
  │ │ ├── node-uuid@1.4.7
  │ │ ├── oauth-sign@0.8.1
  │ │ ├── qs@6.0.2
  │ │ ├── stringstream@0.0.5
  │ │ └── tunnel-agent@0.4.2
  │ └── tough-cookie@2.2.1
  ├── lodash@3.10.1
  ├─┬ meow@3.7.0
  │ ├─┬ camelcase-keys@2.0.0
  │ │ └── camelcase@2.1.0
  │ ├─┬ loud-rejection@1.3.0
  │ │ ├── array-find-index@1.0.1
  │ │ └── signal-exit@2.1.2
  │ ├── map-obj@1.0.1
  │ ├── minimist@1.2.0
  │ ├─┬ normalize-package-data@2.3.5
  │ │ ├── hosted-git-info@2.1.4
  │ │ ├─┬ is-builtin-module@1.0.0
  │ │ │ └── builtin-modules@1.1.1
  │ │ └─┬ validate-npm-package-license@3.0.1
  │ │   ├─┬ spdx-correct@1.0.2
  │ │   │ └── spdx-license-ids@1.2.0
  │ │   └─┬ spdx-expression-parse@1.0.2
  │ │     └── spdx-exceptions@1.0.4
  │ ├─┬ redent@1.0.0
  │ │ ├── indent-string@2.1.0
  │ │ └── strip-indent@1.0.1
  │ └── trim-newlines@1.0.0
  ├─┬ npm-keyword@4.2.0
  │ └── registry-url@3.0.3
  ├── opn@3.0.3
  ├─┬ package-json@2.3.1
  │ ├─┬ rc@1.1.6
  │ │ ├── deep-extend@0.4.1
  │ │ ├── minimist@1.2.0
  │ │ └── strip-json-comments@1.0.4
  │ └── semver@5.1.0
  ├─┬ read-pkg-up@1.0.1
  │ ├─┬ find-up@1.1.2
  │ │ └── path-exists@2.1.0
  │ └─┬ read-pkg@1.1.0
  │   ├─┬ load-json-file@1.1.0
  │   │ └─┬ strip-bom@2.0.0
  │   │   └── is-utf8@0.2.1
  │   └── path-type@1.1.0
  ├─┬ repeating@2.0.0
  │ └─┬ is-finite@1.0.1
  │   └── number-is-nan@1.0.0
  ├─┬ root-check@1.0.0
  │ ├─┬ downgrade-root@1.1.0
  │ │ ├── default-uid@1.0.0
  │ │ └── is-root@1.0.0
  │ └─┬ sudo-block@1.2.0
  │   └── is-docker@1.0.0
  ├─┬ sort-on@1.2.2
  │ ├── arrify@1.0.1
  │ └─┬ dot-prop@2.4.0
  │   └── is-obj@1.0.0
  ├── string-length@1.0.1
  ├── titleize@1.0.0
  ├─┬ update-notifier@0.6.1
  │ ├─┬ boxen@0.3.1
  │ │ ├── filled-array@1.1.0
  │ │ └── widest-line@1.0.0
  │ ├── is-npm@1.0.0
  │ ├── latest-version@2.0.0
  │ └─┬ semver-diff@2.1.0
  │   └── semver@5.1.0
  ├─┬ user-home@2.0.0
  │ └── os-homedir@1.0.1
  ├─┬ yeoman-character@1.1.0
  │ └─┬ supports-color@3.1.2
  │   └── has-flag@1.0.0
  ├─┬ yeoman-doctor@2.1.0
  │ ├─┬ bin-version-check@2.1.0
  │ │ ├─┬ bin-version@1.0.4
  │ │ │ └─┬ find-versions@1.2.1
  │ │ │   └── semver-regex@1.0.0
  │ │ ├── minimist@1.2.0
  │ │ └─┬ semver-truncate@1.1.0
  │ │   └── semver@5.1.0
  │ ├─┬ each-async@1.1.1
  │ │ ├── onetime@1.1.0
  │ │ └── set-immediate-shim@1.0.1
  │ ├── log-symbols@1.0.2
  │ ├── object-values@1.0.0
  │ ├── semver@5.1.0
  │ └─┬ twig@0.8.8
  │   ├─┬ minimatch@0.2.14
  │   │ ├── lru-cache@2.7.3
  │   │ └── sigmund@1.0.1
  │   └─┬ walk@2.3.9
  │     └── foreachasync@3.0.0
  ├─┬ yeoman-environment@1.5.2
  │ ├─┬ debug@2.2.0
  │ │ └── ms@0.7.1
  │ ├── diff@2.2.1
  │ ├─┬ globby@4.0.0
  │ │ ├─┬ array-union@1.0.1
  │ │ │ └── array-uniq@1.0.2
  │ │ └─┬ glob@6.0.4
  │ │   ├── inflight@1.0.4
  │ │   ├─┬ minimatch@3.0.0
  │ │   │ └─┬ brace-expansion@1.1.3
  │ │   │   ├── balanced-match@0.3.0
  │ │   │   └── concat-map@0.0.1
  │ │   └── path-is-absolute@1.0.0
  │ ├── grouped-queue@0.3.2
  │ ├─┬ mem-fs@1.1.2
  │ │ ├─┬ through2@2.0.1
  │ │ │ └── xtend@4.0.1
  │ │ ├─┬ vinyl@1.1.1
  │ │ │ ├── clone@1.0.2
  │ │ │ ├── clone-stats@0.0.1
  │ │ │ └── replace-ext@0.0.1
  │ │ └─┬ vinyl-file@1.3.0
  │ │   └─┬ strip-bom-stream@1.0.0
  │ │     └── first-chunk-stream@1.0.0
  │ ├── text-table@0.2.0
  │ └── untildify@2.1.0
  └─┬ yosay@1.1.0
    ├── minimist@1.2.0
    ├── pad-component@0.0.1
    ├─┬ taketalk@1.0.0
    │ ├── get-stdin@4.0.1
    │ └── minimist@1.2.0
    └── word-wrap@1.1.0

```

- Uma dependência local de desenvolvimento

```js
npm i --save-dev jasmine
class05@1.0.0 /home/victorigor/Área de Trabalho/workshop-be-mean/NodeJS - Be Mean /Arquivos de Exercícios/class05
├─┬ jasmine@2.4.1
│ ├── exit@0.1.2
│ ├─┬ glob@3.2.11
│ │ └─┬ minimatch@0.3.0
│ │   └── lru-cache@2.7.3
│ └── jasmine-core@2.4.1
└─┬ yo@1.7.0
  └─┬ yeoman-doctor@2.1.0
    └─┬ twig@0.8.8
      └─┬ minimatch@0.2.14
        └── lru-cache@2.7.3

```

- Uma dependência local opcional

```js
npm i --save-optional colors
class05@1.0.0 /home/victorigor/Área de Trabalho/workshop-be-mean/NodeJS - Be Mean /Arquivos de Exercícios/class05
└── colors@1.1.2

```

```js
/* COMO FICOU O PACKAGE: */

cat package.json

{
  "name": "class05",
  "version": "1.0.0",
  "description": "exercitando a aula 05",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "node",
    "npm"
  ],
  "author": "Victor Igor",
  "license": "ISC",
  "dependencies": {
    "yo": "^1.7.0"
  },
  "devDependencies": {
    "jasmine": "^2.4.1"
  },
  "optionalDependencies": {
    "colors": "^1.1.2"
  }
}

```

## Crie e execute um script, via npm, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

script.js:
```js
	console.log('UUUIUUUUU vc está aqui: '+__dirname);
```

```js
//executando:
sudo npm run ondeEstou

ondeEstou /home/victorigor/Área de Trabalho/workshop-be-mean/NodeJS - Be Mean /Aulas/npm

> node script.js

UUUIUUUUU  vc está aqui: /home/victorigor/Área de Trabalho/workshop-be-mean/NodeJS - Be Mean /Aulas/npm
```
## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

```js
/*1 - filename */
console.log('Diretorio com o nome do arquivo é: '+__filename);
```

```js
/*2 - dirname */
console.log('Eu estou em '+__dirname)
```

```js
/*3 - buffer */
var buffer = new Buffer('Ola mucura =)');
console.log(buffer.toString());
```

```js
/*4 - setTimeout */
setTimeout(()=>{
	console.log('Ola estou usando timeout');
}, 1000);
```

```js
/*5 - setInterval */
setInterval(()=>{
	console.log('ola estou usando setInterval');
}, 1000);
```

## Explique como funciona e de um exemplo de process

O *process* é um objeto global e uma instancia do *EventEmitter*, então com ele você tem a capacidade de manipular e transmitir eventos.

Exemplo:

```js

process.on('exit', () => console.log('Executando apenas ao final do processo!!!: '));

```
# Exercício de FS Aula 05 Parte 2

## Criar um arquivo
```js
'use strict';

const fs = require('fs');

fs.writeFile('./index.txt', 'Estou criando e escrevendo', 'utf-8', (err)=>{
	if (err) throw err;
	console.log('Arquivo criado');
});

```

## Ler um arquivo
```js

const fs = require('fs');
fs.readFile('./index.txt', 'utf-8', (err, result)=>{
	if (err) throw err;
	console.log(result);
});

```
## Editar o conteúdo desse arquivo
```js

'use strict';
const fs = require('fs');
fs.readFile('./index.txt', 'utf-8', (err, data)=>{
	if (err) throw err;

	data = data.replace('escrevendo', 'EDITEI AQUI');

	fs.writeFile('./index.txt', data, 'utf-8', (err)=>{
		if (err) throw err;
		console.log('Arquivo modificado com sucesso!');
	});
});
```

## Deletar arquivo
```js

'use strict';
const fs = require('fs');
fs.unlink('index.txt', (err)=>{
	if (err) throw err;
	console.log('Arquivo deletado!');
})

```

## Renomear arquivo
```js
const fs = require('fs');
fs.rename('./index.txt', 'index2.txt', (err)=>{
	if (err) throw err;
	console.log('Arquivo renomeiado');
});

```


text:
# Node.js - Aula 05 - Parte 1 - Exercícios

**User:** [angelorubin](https://github.com/angelorubin)

**Autor:** Angelo Rogério Rubin

**Date:** 1453919880

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0

	PS C:\Projetos\pokemons-api> npm install nvm-win
	pokemons-api@0.0.1 C:\Projetos\pokemons-api
	├─┬ nodemon@1.8.1
	│ ├─┬ chokidar@1.4.2
	│ │ └─┬ readdirp@2.0.0
	│ │   └── readable-stream@2.0.5
	│ └─┬ update-notifier@0.5.0
	│   └─┬ latest-version@1.0.1
	│     └─┬ package-json@1.2.0
	│       └─┬ got@3.3.1
	│         ├─┬ duplexify@3.4.2
	│         │ └── readable-stream@2.0.5
	│         └─┬ read-all-stream@3.0.1
	│           └── readable-stream@2.0.5
	└── nvm-win@0.2.4  extraneous

	npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
	npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.6
	npm WARN mongodb-core@1.2.32 requires a peer of kerberos@~0.0 but none was installed.
	npm WARN pokemons-api@0.0.1 No repository field.
	PS C:\Projetos\pokemons-api>

## Inicie um projeto novo para essa aula, com o npm e instale, salvando no package.json:

	PS C:\Projetos\pokemons-api> npm init
	This utility will walk you through creating a package.json file.
	It only covers the most common items, and tries to guess sensible defaults.

	See `npm help json` for definitive documentation on these fields
	and exactly what they do.

	Use `npm install <pkg> --save` afterwards to install a package and
	save it as a dependency in the package.json file.

	Press ^C at any time to quit.
	name: (pokemons-api)
	version: (0.0.1)
	git repository:
	license: (MIT) MIT
	About to write to C:\Projetos\pokemons-api\package.json:

	{
	  "name": "pokemons-api",
	  "version": "0.0.1",
	  "description": "API Pokemons",
	  "main": "index.js",
	  "scripts": {
	    "test": "echo \"Error: no test specified\" && exit 1",
	    "roda": "node npm/script.js"
	  },
	  "keywords": [
	    "pokemons",
	    "node",
	    "mongodb",
	    "webschool"
	  ],
	  "author": "Angelo Rubin",
	  "license": "MIT",
	  "dependencies": {
	    "mongoose": "^4.3.6",
	    "nodemon": "^1.8.1"
	  },
	  "devDependencies": {
	    "jasmine": "^2.4.1"
	  }
	}

	Is this ok? (yes) yes

1 - Dependência Local

	PS C:\Projetos\pokemons-api> npm i express -S
	pokemons-api@0.0.1 C:\Projetos\pokemons-api
	├── express@4.13.3  extraneous
	└── nvm-win@0.2.4  extraneous

	npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
	npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.6
	npm WARN mongodb-core@1.2.32 requires a peer of kerberos@~0.0 but none was installed.
	npm WARN pokemons-api@0.0.1 No repository field.

2 - Dependência Local de Desenvolvimento

	PS C:\Projetos\pokemons-api> npm i express -SD
	pokemons-api@0.0.1 C:\Projetos\pokemons-api
	└── nvm-win@0.2.4  extraneous

	npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
	npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.6
	npm WARN mongodb-core@1.2.32 requires a peer of kerberos@~0.0 but none was installed.
	npm WARN pokemons-api@0.0.1 No repository field.

3 - Dependência Local Opcional

	PS C:\Projetos\pokemons-api> npm i color -SO
	pokemons-api@0.0.1 C:\Projetos\pokemons-api
	├─┬ color@0.11.1
	│ ├── color-convert@0.5.3
	│ └─┬ color-string@0.3.0
	│   └── color-name@1.1.1
	├── express@4.13.3
	└── nvm-win@0.2.4  extraneous

	npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
	npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.6
	npm WARN mongodb-core@1.2.32 requires a peer of kerberos@~0.0 but none was installed.
	npm WARN pokemons-api@0.0.1 No repository field.

## Crie e execute um script, via 'npm', que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

	PS C:\Projetos\pokemons-api> npm run script

	> pokemons-api@0.0.1 script C:\Projetos\pokemons-api
	> node npm/run-script-by-npm.js

	Fui executado pelo comando run do npm.

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

### __dirname

Retorna o nome do diretório em que o script esta atualmente em execução.

Exemplo:

	console.log(__dirname);

Resultado:

	PS C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system> node _dirname.js
	C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system

### _filename

Retorna o nome do arquivo do código que está sendo executado. Mostra o caminho absoluto do arquivo.

Exemplo:

	console.log(__filename);

Resultado:

	PS C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system> node _filename.js
	C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system\_filename.js

### clearTimeout(t)

Para um temporizador que foi criado anteriormente com setTimeout (). O retorno de chamada não será executado.

Exemplo:

	var timeout = setTimeout(function(str1, str2) {
	  console.log(str1 + " " + str2);
	}, 1000, "Hello.", "How are you?");

	clearTimeout(timeout);

### clearInterval(t)

Para um temporizador que foi criado anteriormente com setInterval (). O retorno de chamada não será executado.

As funções de temporizador são variáveis globais.

Exemplo:

	var i = 1;
	var interval = setInterval(function() { alert(i++) }, 2000);
	clearInterval(interval);

### console.log()

O módulo de console fornece um console de depuração simples que é semelhante ao mecanismo de console JavaScript fornecido pelos navegadores da web.

O módulo exporta dois componentes específicos:

Uma classe de console com métodos tais como console.log (), console.error () e console.warn () que pode ser usada para escrever para qualquer fluxo Node.js.

Uma instância do console global configurado para escrever para stdout e stderr.

Como este objeto é global, ele pode ser usado sem chamar require ('console').

Exemplo:

	console.log('hello world'); // hello world

## Explique como funciona e de um exemplo de 'process'.

O objeto process é um objeto global e pode ser acessado de qualquer lugar. Ele é uma instância de [EventEmitter](http://devdocs.io/node/events#events_class_events_eventemitter "EventEmitter").

Exemplo:

	process.on('exit', (code) => {
	  setTimeout(() => {
	    console.log('This will not run');
	  }, 0);
	  console.log('About to exit with code:', code);
	});

# Node.js - Aula 05 - Parte 2 - Exercícios

## File System

### Criar um arquivo.

	'use strict';

	const fs = require('fs');

	fs.writeFile('mensagem.txt', 'Olá, eu sou um arquivo.', (err) => {
	  if (err) throw err;
	  console.log('Arquivo criado e salvo com sucesso.');
	});

Resultado:

	PS C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system> node criar-arquivo.js
	Arquivo criado e salvo com sucesso.

### Ler um arquivo.

	'use strict';

	const fs = require('fs');

	fs.readFile('mensagem.txt', (err, data) => {
	  if (err) throw err;
	  console.log(data.toString());
	});

Resultado:

	PS C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system> node ler-arquivo.js
	Olá, eu sou um arquivo.

### Editar conteúdo desse arquivo.

	'use strict';

	const fs = require('fs');

	fs.readFile('mensagem.txt', 'utf-8', (err, data) => {
	    if (err) throw err;

	    const content = data + "\n Sou um novo conteúdo adicionado ao arquivo.";

	    fs.writeFile('mensagem.txt', content, 'utf-8', (err) => {
	        if (err) throw err;
	        console.log(content);
	    });
	});

Resultado:

	PS C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system> node editar-arquivo.js
	Olá, eu sou um arquivo.
	Sou um novo conteúdo adicionado ao arquivo.

### Deletar arquivo.

	'use strict';

	const fs = require('fs');

	fs.unlink('mensagem.txt', (err) => {
	  if (err) throw err;
	  console.log('Arquivo deletado com sucesso.');
	});

Resultado:

	PS C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system> node deletar-arquivo.js
	Arquivo deletado com sucesso.

### Renomear o arquivo.

	'use strict';

	const fs = require('fs');

	fs.rename('mensagem.txt', 'mensagem-renomeada.txt', (err, data) => {
	  if (err) throw err;
	  console.log('Arquivo renomeado com sucesso.');
	});

Resultado:

	PS C:\Projetos\be-mean-instagram\be-mean-code-examples\file-system> node renomear-arquivo.js
	Arquivo renomeado com sucesso.

# Desafio: Criar um servidor web de arquivos estáticos (CSS, HTML, JS).

app.js

	'use strict';

	const http = require('http');
	const fs = require('fs');
	const path = require('path');

	http.createServer((request, response) => {

	    let filePath = '.' + request.url;

	    if (filePath == './')
	        filePath = './index.html';

	    let extname = path.extname(filePath);

	    switch (extname) {
	    	case '.css':
	            contentType = 'text/css';
	            break;
	        case '.js':
	            contentType = 'text/javascript';
	            break;
	        case '.html':
	            contentType = 'text/html';
	            break;
	    }

	    let contentType = 'text/html';

	    fs.readFile(filePath, (error, content) => {
	        if (error) {
	            if (error.code == 'ENOENT') {
	                fs.readFile('./404.html', (error, content) => {
	                    response.writeHead(200, {
	                        'Content-Type': contentType
	                    });
	                    response.end(content, 'utf-8');
	                });
	            }
	        }
	        else {
	            response.writeHead(200, {
	                'Content-Type': contentType
	            });
	            response.end(content, 'utf-8');
	        }
	    });

	}).listen(3000);
	console.log('Servidor rodando em http://localhost:3000');

### Acessando CSS

![CSS](http://s26.postimg.org/ku7vf6ck9/css_fw.png)

### Acessando JS

![JS](http://s26.postimg.org/l897erwnt/js_fw.png)

### Acessando HTML

![HTML](http://s26.postimg.org/hd5tc7di1/html_fw.png)

### Pagina Não Encontrada.

![404](http://s26.postimg.org/85imsmcrd/404_not_found_fw.png)


text:
# Node.js - Aula 05 - Exercício

**user:** [tuchedsf](https://github.com/tuchedsf)

**autor:** Diego Ferreira

## 1- Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0
Já o gerenciador de versão foi o nvm.

```
diego@MacBook-Air-Diego ~> curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
diego@MacBook-Air-Diego:~ diego$ nvm --version
0.31.0
node --version
v5.4.1
```

## 2- Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:
```
diego@MacBook-Air-Diego ~/Mean> cd sdm-control/
diego@MacBook-Air-Diego ~/M/sdm-control> ls
diego@MacBook-Air-Diego ~/M/sdm-control> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (sdm-control)
version: (1.0.0)
description: controle de chamados
entry point: (index.js)
test command:
git repository:
keywords: controle, sdm, sla
author: Diego Ferreira
license: (ISC)
About to write to /Users/diego/Mean/sdm-control/package.json:

{
  "name": "sdm-control",
  "version": "1.0.0",
  "description": "controle de chamados",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "controle",
    "sdm",
    "sla"
  ],
  "author": "Diego Ferreira",
  "license": "ISC"
}

Is this ok? (yes) y
```

###- 1 dependência local
```
diego@MacBook-Air-Diego ~/M/sdm-control> npm install --save mongoose

```

###- 1 dependência local de desenvolvimento
```
diego@MacBook-Air-Diego ~/M/sdm-control> npm install --dev jasmine
```
###- 1 dependência local opcional

```
diego@MacBook-Air-Diego ~/M/sdm-control> npm install --save morgan
```

###- Arquivo package.json após instalaçao das dependências
```
{
  "name": "sdm-control",
  "version": "1.0.0",
  "description": "controle de chamados",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "controle",
    "sdm",
    "sla"
  ],
  "author": "Diego Ferreira",
  "license": "ISC",
  "dependencies": {
    "mongoose": "^4.3.5"
  },
  "devDependencies": {
    "jasmine": "^2.4.1"
  },
  "optionalDependencies": {
    "morgan": "^1.7.0"
  }
}
```

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.
```
//Arquivo script.js
console.log( __dirname );

//Package.json
{
  "name": "sdm-control",
  ...
  "scripts" : {
    "roda" : "node script.js"
  }
}

//Execução
diego@MacBook-Air-Diego ~/M/sdm-control> npm run roda

> sdm-control@1.0.0 roda /Users/diego/Mean/nodejs/sdm-control
> node script.js

/Users/diego/Mean/nodejs/sdm-control

```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

1. `__dirname` retorna o nome do diretório que o script está sendo rodado.
```js
  console.log(__dirname); // /Users/diego/Mean/nodejs/sdm-control
```

2. `__filename` retorna o endereço absoluto do arquivo executado.
```js
  console.log(__dirname); // /Users/diego/Mean/nodejs/sdm-control/example.js
```

3. `console.log()` A classe console prove um debug simples. Uma utilização á funçao log, que imprime o conteúdo que estiver entre o parênteses.
```js
  console.log("Diego"); // Diego
```

4. `Buffer` - A classe buffer é responsável por ler e manipular streams binários. Um método existente nesta classe é o compare, que compara buffers. E retorna 0 (identico), 1(se 1 buffer diferente), -1 (se segundo buffer diferente).
```
const buf1 = new Buffer('ABC');
const buf2 = new Buffer('BCD');
console.log(buf1.compare(buf1));
// Prints: 0
console.log(buf1.compare(buf2));
// Prints: -1
console.log(buf2.compare(buf1));
// Prints: 1
```

5. `require` Responsável por carregar algum recurso ao diretório atual para ser utilizado por algum script.
```js
  const circle = require('./circle.js'); // Adiciona o conteudo do arquivo circle.js, no arquivo que o mesmo esta sendo requerido.
```

## Explique como funciona e de um exemplo de `process`.
Process é um objeto global do node que pode ser acessado de qualquer lugar. Ele é uma instancia do eventEmitter que é responsável por prover a arquitetura assíncrona ao nodejs.

ex.:  Evento ' uncaughtException ' é emitido quando uma exceção acontece e o node retorna ao processo padrao. Por padrão, o Node.js lida com essas exceções , imprimindo o rastreamento de pilha para stderr e sair . Adicionando um manipulador para o evento ' uncaughtException ' substitui esse comportamento padrão.

```
process.on('uncaughtException', (err) => {
  console.log(`Caught exception: ${err}`);
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');
```

##Aula5 - Parte2
##1 - Criar um arquivo
```
var fs = require('fs');
// Sincrona - para funcao sincrona basta adicionar o Sync no método.
var write = fs.writeFileSync("./Hello.txt", "Hello mother fucker");
// Assincrona omite-se o Sync e inclui um callback na função
fs.writeFile("./Hello.txt", "teste", function(err,result){
  if (err){
    throw err;
  }
  console.log(result);
});
```

##2 - Ler um arquivo
```
var fs = require('fs');
//assincrono
fs.readFile('./dirNode2/hiWorld.txt','utf8', function(err,result){
  if (err) throw err;
  console.log(result);
});
//sincrono
var readSync = fs.readFileSync('./dirNode2/helloWord.txt','utf8');
console.log(readSync);
```

##3 - Editar counteúdo desse arquivo
```
var fs = require('fs');
//Assincrono
fs.open('./Hello.txt','r', function(err,result){
  if (err){
    throw err;
  }
  var write = fs.writeFileSync("./Hello.txt", "Hello mother fucker");
  console.log(result);
});
```

##4 - Deletar um arquivo
```
var fs = require('fs');
fs.unlink('./Hello.txt', function(err){
  if(err) throw err;
  console.log('arquivo deletado!');
});
```

##5 - Renomear arquivo
```
var fs = require('fs');
//assincrono
fs.rename('./dirNode2/helloWord.txt', './dirNode2/helloWorld.txt', function(err){
  if (err) throw err;
  console.log("fui renomeado com node");
});
```

## Desafio:Criar um servidor web de arquivos estáticos: .css, .html, .js e etc...

```
'use strict';

const fs = require('fs');
const path = require('path');
const http = require('http');

http.createServer (function(req,resp){

  let file = path.basename(req.url),
      ext = path.extname(file);

  switch (ext) {
  	case '.html':
      readFile(file, 'text/html', resp);
  		break;

  	case '.css':
      readFile(file, 'text/css', resp);
   		break;

    case '.js':
      readFile(file, 'text/javascript', resp);
      break;

  	case '.jpg':
      readFile(file, 'image/jpeg', resp);
  		break;

  	default:
    error("404 - Nenhum arquivo encontrado", resp);
   }

}).listen(3000,function(){
  console.log("Servidor rodando na porta 3000!!!");
});

function readFile(file, contentType, resp){
  fs.readFile(file, 'utf8', (err, data) => {
        if (err) {
            error(err.toString(),resp);
        } else {
            sucesso(resp,contentType,data);
        }
    });
}

function cabecalho(requestCode, contentType,  resp){
  resp.writeHead(requestCode, {'Content-Type':contentType+';charset=utf-8'});
}

function error(err, resp){
  cabecalho(404, "text/html", resp);
  resp.end(err.toString());
}

function sucesso(resp, contentType, data){
  cabecalho(200, contentType, resp);
  resp.end(data);
}
```

## Bibliografia
http://nomadev.com.br/node-js-o-que-%C3%A9-nvm-e-como-gerenciar-vers%C3%B5es-do-node/
https://nodejs.org/dist/latest-v4.x/docs/api/globals.html
https://nodejs.org/dist/latest-v4.x/docs/api/console.html
https://nodejs.org/dist/latest-v4.x/docs/api/buffer.html
https://nodejs.org/dist/latest-v4.x/docs/api/modules.html#modules_modules
https://nodejs.org/dist/latest-v4.x/docs/api/process.html#process_process
https://github.com/creationix/nvm


text:
# Node.js - Aula 05 - Exercício
**user:** [gkal19](https://github.com/gkal19)
**autor:** Gabriel Kalani

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0
```js
npm -v
2.14.12

node -v
v4.2.6

```
## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:
```js

npm init

{
  "name": "ex5",
  "version": "2.14.12",
  "description": "Exercício da Aula 05 de Node.JS",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "webschool",
    "suissa",
    "node"
  ],
  "author": "Gabriel Kalani",
  "license": "MIT"
}
```

- 1 dependência local

```js
npm i -S mongoose
```
- 1 dependência local de desenvolvimento

```js
npm install -SD jasmine
```
- 1 dependência local opcional

```js
npm install -SO color
```

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

```js
// test.js
console.log("Tá tranquilo, Tá compilado!");
```

```js
// package.json
  "scripts":{
    "rodar": "node test.js"
  }
```

```js
npm run rodar

> node test.js

Tá tranquilo, Tá compilado!
```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

```js
//Console serve para `printar` mensagens
console.log( 'Tá tranquilo, Tá compilado!');

//Require chama os módulos do Node.
require('http');

//setInterval executa uma função a cada "x" milisegundos.
setInterval(() => {
   console.log(Date.now());
}, 1000);

//dirName Retorna o caminho do diretório atual.
console.log(__dirname);

//fileName Retorna o caminho do arquivo atual.
console.log(__filename);

```

## Explique como funciona e de um exemplo de `process`.
É um objeto global que manipula ou transmite eventos.

```js
// filename: process.js
'use strict';

process.on('uncaughtException', (err) => {
  console.log('Oops! Parece que tivemos um erro...');
});
```

```js
node process.js

Oops! Parece que tivemos um erro...
```

## File System

### Criar um arquivo.
```js
// file: createFile
const fs = require('fs')

const write = fs.writeFileSync("./hello.txt","Tá tranquilo, Tá compilado!");
```

### Ler um arquivo.
```js
// file: readFile.js
const fs = require('fs');

fs.readFile('./meusArquivos/hello-world.txt', 'utf8', (err, data) => {
	if (err) throw err;
	console.log(data);
});
```

### Editar conteúdo desse arquivo.
```js
// file: updateFile.js
const fs = require('fs');

fs.writeFileSync('./meusArquivos/hello-world.txt','Aprendendo NodeJS com meus professores =]');
```

### Deletar arquivo.
```js
// file: deleteFile.js

const fs = require('fs');

fs.unlink('renameFile.txt', err => {
	if(err) throw err;
	console.log('Deletado com sucesso');
});
```

### Renomear o arquivo.
```js
// file: renameFile.js
const fs = require('fs');

fs.rename('./meusArquivos/hello-world.txt', './meusArquivos/helloWorld.txt', err => {
	if (err) throw err;
})
```

## Desafio: Criar um servidor web de arquivos estáticos.
```js
'use strict';

const http = require('http'),
fs = require('fs'),
port = 3000;

// create directory for files.
try{

	fs.accessSync('files', fs.F_OK);

	}catch (e){

	fs.mkdirSync('files');
}

http.createServer((req, res) => {

		const path = `files${req.url}`;

		try{
			fs.accessSync(path, fs.R_OK);

			if(fs.lstatSync(path).isDirectory()){
				res.writeHeader(200, {"Content-Type": "text/html;charset=utf-8"});
				try{
				const indexPath = `${path}/index.html`;
				res.write(fs.readFileSync(indexPath, 'utf-8'));
				}catch(e){
					const files = fs.readdirSync(path);
					files.forEach(nome =>{
						res.write(`<a href="${req.url}/${nome}">${nome}</a><br>`);
					});
				}

			}else{
				const typeFile = path.split(".");
				switch(typeFile[typeFile.length-1]){
					case 'css':
					res.writeHeader(200, {"Content-Type": "text/css"});
					break;
					case 'html':
					res.writeHeader(200, {"Content-Type": "text/html;charset=utf-8"});
					break;
					case 'jpg':
					res.writeHeader(200, {"Content-Type": "image/jpeg"});
					break;
					case 'png':
					res.writeHeader(200, {"Content-Type": "image/png"});
					break;

				}
				res.write(fs.readFileSync(path));
			}
		} catch(e){
			res.writeHeader(404, {"Content-Type": "text/html;charset=utf-8"});
			res.write('Página não encontrada');
		}

		res.end();

}).listen(port, () => {
	console.log(`Server rodando em localhost: ${port}`);
});
```
Acessando servidor:
!['Index'](http://i.imgur.com/omsNKlF.jpg)


text:
# Node.js - Aula 05 - Exercício

**user:** [diegolopesdev](http://github.com.br/diegolopesdev)

**autor:** Diego Lopes

## Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0

Imagine que estou no Terminal e que vou instalar o gerenciador de versão do NodeJS chamado *n*.

```
sudo npm install n -g

```
Após instalar o *n*, eu escolho a versão que desejo instalar escrevendo a seguinte linha de código:

```
sudo n 5.5.0
```
ou, se houver necessidade de instalar a última versão:

```
sudo n latest
```

Eu estou usando o comando *sudo* porque estou no sistema operacional ubuntu, que é baseado no Debian, e que por padrão vem instalado. No Debian, por exemplo, o *sudo* não vem instalado por padrão, não havendo necessidade de usar a palavra *sudo*.

## Inicie um projeto novo para essa aula, com o `npm` e instale, salvando no `package.json`:

Terminal:

```
sudo mkdir maciota
cd maciota
npm init
```

Arquivo *package.json* sem dependências:

```js
{
  "name": "maciota",
  "version": "0.0.2",
  "description": "Gerador da palavra Maciota",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "maciota",
    "maciota",
    "com",
    "node"
  ],
  "author": "Diego Lopes",
  "license": "MIT"
}
```
No Terminal, eu escreverei o seguinte comando para instalar a dependência e salvar diretamente no meu arquivo *package.json*:

```
sudo npm install mongoose --save
```
Arquivo *package.json* com dependências instaladas.

```js
{
  "name": "maciota",
  "version": "0.0.2",
  "description": "Gerador da palavra Maciota",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "maciota",
    "maciota",
    "com",
    "node"
  ],
  "author": "Diego Lopes",
  "license": "MIT",
  "dependencies": {
    "mongoose": "^4.4.1"
  }
}

```

## Crie e execute um script, via `npm`, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.

No arquivo *dir.js*, escreverei o seguinte comando:

```js
console.log("Meu diretório atual é:" + __dirname);
```

*package.json*

```js
{
  "name": "maciota",
  "version": "0.0.2",
  "description": "Gerador da palavra Maciota",
  "main": "app.js",
  "scripts": {
    "start": "node dir"
  },
  "keywords": [
    "maciota",
    "maciota",
    "com",
    "node"
  ],
  "author": "Diego Lopes",
  "license": "MIT",
  "dependencies": {
    "mongoose": "^4.4.1"
  }
}
```

```
npm start
Meu diretório atual é:/home/diego/Estudos/NodeJS/05/maciota
```

## Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.

*__dirname*

```js
console.log('Meu diretório atual é:' + __dirname);
```

*__filename*

```js
console.log('Meu arquivo se chama:' + __filename);

```

*process*

```js
process.on('exit', (code) => {
      console.log('O processo terminou com o código: ', code);
});
```

*module*

```js
module.exports = (base, altura) => {
   return {
      area: function(){
         return (base * altura)/2;
      }
   }
}

```

*setTimeout*

```js
setTimeout(() => {
   console.log('Eu executei depois de 2 secundos. rs')
}, 2000)
```

## Explique como funciona e de um exemplo de `process`.

*Process* é um objeto global que é uma instância de *EventEmitter* responsável por manipular e transmitir eventos no Node. Com ele eu posso controlar quando um evento de saída *exit* acontece ou até mesmo quando ocorre alguma exceção *uncaughtException*.
Por ser um objeto global, não é necessário usar o *require*.

```js
var fs = require('fs');

process.on('beforeExit', () => {
      console.log('Antes de fechar o processo, vamos ler o nosso arquivo package.json');

      fs.open('package.json', (err, data) => {
         if(err) throw err;
         console.log(data);
      });
});
```


text:
# Node.js - Aula 05 - Exercício

autor: Bruno Lima da Silva

## 1. Instale algum gerenciador de versão do Node.js e instale a versão mais atual como padrão, enquanto escrevo é a versão 5.4.0
npm i n -g || npm i nvm -g
node -v
v6.9.1

## 2. Inicie um projeto novo para essa aula, com o npm e instale, salvando no package.json:
mkdir npm
cd npm
npm init
- 1 dependência local
npm i -S react
- 1 dependência local de desenvolvimento
npm i -D webpack
- 1 dependência local opcional
npm i -O colors
```js
cat package.json
{
  "name": "npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^15.3.2"
  },
  "devDependencies": {
    "webpack": "^1.13.3"
  },
  "optionalDependencies": {
    "colors": "^1.1.2"
  }
}
```

## 3. Crie e execute um script, via npm, que mostre uma mensagem no console com a global, que possui caminho para o diretório atual.
mkdir scrtip.js
```js
'use strict';
console.log (__dirname);
```
e no package.json
```js
"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "start": "node script.js"
},
```

## 4. Cite 5 globais do Node.js e pelo menos 1 exemplo de cada.
- dirname: O nome do diretório no qual o script em execução reside.
```js
console.log (__dirname);
> node script.js

/home/fsociety/be-mean-instagram/nodeJS/npm
```
- filename: O nome do arquivo do código que está sendo executado. Esse é o caminho absoluto resolvido desse arquivo de código.
```js
console.log (__filename);
> node script.js

/home/fsociety/be-mean-instagram/nodeJS/npm/script.js
```
- module: Uma referência ao módulo atual.
```js
console.log(module);
> node script.js

Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '/home/fsociety/be-mean-instagram/nodeJS/npm/script.js',
  loaded: false,
  children: [],
  paths:
   [ '/home/fsociety/be-mean-instagram/nodeJS/npm/node_modules',
     '/home/fsociety/be-mean-instagram/nodeJS/node_modules',
     '/home/fsociety/be-mean-instagram/node_modules',
     '/home/fsociety/node_modules',
     '/home/node_modules',
     '/node_modules' ] }
```
- buffer: usado para manipular dados binários
```js
var buff = new Buffer('Hello World!');
console.log(buff.toString());
```
- set time out: acrescenta um atraso na execução da função
```js
setTimeout(() => {
    console.log("Após um segundo é executado");
}, 1000);
```
## 5. Explique como funciona e de um exemplo de process.
- Process é um objeto do NodeJS que fornece informações sobre o controle atual de processos do NodeJS. É uma instância de EventEmitter, ou seja, um emissor de eventos.
```js
// 'exit' é emitido quando um processo do NodeJS está a ser encerrado.
process.on ('exit', (code) => {
    setTimeout (() => {
        console.log('Estou saindo')
    }, 0)
})
```