0% encontró este documento útil (0 votos)
57 vistas

Node - Js e Microservices - Fontes

El documento contiene más de 200 códigos de Node.js y JavaScript con ejemplos de sintaxis, funciones, operadores, bucles y más. También incluye enlaces a recursos adicionales del autor sobre Node.js.

Cargado por

William Silva
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
57 vistas

Node - Js e Microservices - Fontes

El documento contiene más de 200 códigos de Node.js y JavaScript con ejemplos de sintaxis, funciones, operadores, bucles y más. También incluye enlaces a recursos adicionales del autor sobre Node.js.

Cargado por

William Silva
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 84

Node.

js e Microservices

LuizTools.com.br
Facebook.com/luiztools
Twitter.com/luiztools
LinkedIn.com/in/luizfduartejr

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 1

Código 2

Código 3

Código 4

Código 5

Código 6

Código 7

Código 8

Código 9

Código 10

Código 11

Código 12

Código 13

Código 14

Código 15

Código 16

Código 17

Código 18

Código 19

Código 20

Código 21

Código 22

Código 23

Código 24

Código 25

Código 26

Código 27

Código 28
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 29

Código 30

Código 31

Código 32

Código 33

Código 34

Código 35

Código 36

Código 37

Código 38

Código 39

Código 40

Código 41

Código 42

Código 43

Código 44

Código 45

Código 46

Código 47

Código 48

Código 49

Código 50

Código 51

Código 52

Código 53

Código 54

Código 55

Código 56

Código 57

Código 58
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 59

Código 60

Código 61

Código 62

Código 63

Código 64

Código 65

Código 66

Código 67

Código 68

Código 69

Código 70

Código 71

Código 72

Código 73

Código 74

Código 75

Código 76

Código 77

Código 78

Código 79

Código 80

Código 81

Código 82

Código 83

Código 84

Código 85

Código 86

Código 87

Código 88
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 89

Código 90

Código 91

Código 92

Código 93

Código 94

Código 95

Código 96

Código 97

Código 98

Código 99

Código 100

Código 101

Código 102

Código 103

Código 104

Código 105

Código 106

Código 107

Código 108

Código 109

Código 110

Código 111

Código 112

Código 113

Código 114

Código 115

Código 116

Código 117

Código 118
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 119

Código 120

Código 121

Código 122

Código 123

Código 124

Código 125

Código 126

Código 127

Código 128

Código 129

Código 130

Código 131

Código 132

Código 133

Código 134

Código 135

Código 136

Código 137

Código 138

Código 139

Código 140

Código 141

Código 142

Código 143

Código 144

Código 145

Código 146

Código 147

Código 148
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 149

Código 150

Código 151

Código 152

Código 153

Código 154

Código 155

Código 156

Código 157

Código 158

Código 159

Código 160

Código 161

Código 162

Código 163

Código 164

Código 165

Código 166

Código 167

Código 168

Código 169

Código 170

Código 171

Código 172

Código 173

Código 174

Código 175

Código 176

Código 177

Código 178
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 179

Código 180

Código 181

Código 182

Código 183

Código 184

Código 185

Código 186

Código 187

Código 188

Código 189

Código 190

Código 191

Código 192

Código 193

Código 194

Código 195

Código 196

Código 197

Código 198

Código 199

Código 200

Código 201

Código 202

Código 203

Código 204

Código 205

Código 206

Código 207

Código 208
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 209

Código 209

Código 210

Código 211

Código 212

Código 213

Código 214

Código 215

Código 216

Código 217

Código 218

Código 219

Código 220

Código 221

Código 222

Código 223

Código 224

Código 225

Código 226

Código 227

Código 228

Código 229

Código 230

Código 231

Código 232

Código 233

Código 234

Código 235

Código 236

Código 237
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Curtiu o livro?

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 1
node -v

Código 2
node

Código 3
var​ x​=​0
console​.​log​(​x​)

Código 4
console​.​log​(​x​+​1​)

Código 5
console​.​log​(​'​Olá mundo!​')​

Código 6
node /documents/index.js

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 7
console.​log​(​'​Hello World​'​)

Código 8
var​ x ​=​ ​1

Código 9
x ​=​ ​'​teste​'

Código 10
let​ x​,​ y​,​ z

Código 11
let​ x ​=​ ​1

Código 12
// comentário de uma linha
// tudo após as duas barras é considerado comentário

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 13
/* comentário
de múltiplas linhas */

Código 14
// Declaracao e inicializacao de duas variaveis, troque os valores se quiser
let​ a ​=​ ​5
let​ b ​=​ ​2
// Varios exemplos de operacoes sobre variaveis
console​.​log​(​'​a = ​'​ ​+​ a​)
console​.​log​(​'​b = ​'​ ​+​ b​)
console​.​log​(​'​a + b = ​'​ ​+​ ​(​a ​+​ b​))
console​.​log​(​'​a - b = ​'​ ​+​ ​(​a ​-​ b​))
console​.​log​(​'​a * b = ​'​ ​+​ ​(​a ​*​ b​))
console​.​log​(​'​a / b = ​'​ ​+​ ​(​a ​/​ b​))
console​.​log​(​'​a % b = ​'​ ​+​ ​(​a ​%​ b​))
console​.​log​(​'​a++ = ​'​ ​+​ ​(​a​++))
console​.​log​(​'​--b = ​'​ ​+​ ​(--​b​))
console​.​log​(​'​a = ​'​ ​+​ a​)
console​.​log​(​'​b = ​'​ ​+​ b​)

Código 15
let​ a ​=​ ​15
let​ b ​=​ ​12
let​ c ​=​ ​'​15​'
console​.​log​(​'​a = ​'​ ​+​ a​)
console​.​log​(​'​b = ​'​ ​+​ b​)
// aqui a igualdade é apenas sobre o valor, mas são valores diferentes
console​.​log​(​'​a == b : ​'​ ​+​ ​(​a ​==​ b​))
// aqui, o interpretador acha que são iguais, pois o valor é o mesmo, mas com tipos
diferentes
console​.​log​(​'​a == c : ​'​ ​+​ ​(​a ​==​ c​))
// agora sim, valida-se o tipo primeiro e depois o valor
console​.​log​(​'​a === c : ​'​ ​+​ ​(​a ​===​ c​))

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
// ou seja, use sempre === e !==
console​.​log​(​'​a !== b : ​'​ ​+​ ​(​a ​!==​ b​))
console​.​log​(​'​a < b : ​'​ ​+​ ​(​a ​<​ b​))
console​.​log​(​'​a > b : ​'​ ​+​ ​(​a ​>​ b​))
console​.​log​(​'​a <= b : ​'​ ​+​ ​(​a ​<=​ b​))
console​.​log​(​'​a >= b : ​'​ ​+​ ​(​a ​>=​ b​))

Código 16
var​ result ​=​ ​false
i ​=​ ​0
y ​=​ a​*​x ​+​ b

Código 17
const​ i ​=​ ​0
let​ y ​=​ i ​+​ ​2
console​.​log​(​'​Valor do i: ​'​ ​+​ i​)

Código 18
function​ soma(​ n
​ um1,​ ​ num2​){​ ​ ​return​ num1 +
​ ​ num2 ​}

Código 19
var​ somar ​=​ ​function​(​num1​,​ num2​)​ ​{​ ​return​ num1 ​+​ num2 ​}

Código 20

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
somar​(​1​,​2​)

Código 21
outraFuncao(somar)

Código 22
var​ somar ​=​ ​(​num1​,​num2​)​ ​=>​ num1 ​+​ num2

Código 23
const​ nome ​=​ ​'​Luiz​'

Código 24
const​ nome ​=​ ​'​Luiz​'
const​ sobrenome ​=​ ​'​Duarte​'
console​.​log​(​'​Prof. ​'​ ​+​ nome ​+​ sobrenome​)

Código 25
const​ nome ​=​ ​'​Luiz​'
const​ idade ​=​ ​28
console​.​log​(​'​Prof. ​'​ ​+​ nome ​+​ ​'​ tem ​'​ ​+​ idade ​+​ ​'​ anos!​'​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 26
let​ str ​=​ ​'​Teste​'
console​.​log​(​str​.​length​)
console​.​log​(​str​.​toUpperCase​())
console​.​log​(​str​.​toLowerCase​())
str ​=​ ​'​1​'
console​.​log​(​parseInt​(​str​))
str ​=​ ​'​1.5​'
console​.​log​(​parseFloat​(​str​))

Código 27
for​ ​(​var​ i​=​0​;​ i ​<​ ​10​;​ i​++)
console​.​log​(​'​i=​'​ ​+​ i​)

Código 28
for​ ​(​var​ i​=​0​;​ i ​<​ ​10​;​ i​++)​{
console​.​log​(​“i​=​” ​+​ i​)
//outra instrução qualquer, quantas quiser
}

Código 29
let​ chave ​=​ ​true
while​(​chave ​===​ ​true​)
chave ​=​ ​false

Código 30

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
let​ chave ​=​ ​true
while​(​chave ​===​ ​true​)​{
​//outra instrução qualquer
console​.​log​(​'​Imprime!​'​)
chave ​=​ ​false
}

Código 31
let​ i ​=​ ​0
while​(​i ​<​ ​10​)​{
​//outra instrução qualquer
console​.​log​(​'​Imprime!​'​)
i​++
}

Código 32
let​ chave ​=​ ​false​;
do​{
​//outra instrução qualquer
console​.​log​(​'​Imprime!​'​)
}​while​(​chave ​===​ ​true​)

Código 33
let​ x ​=​ ​0
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)
console​.​log​(​x​++)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 34
for​(​var​ i​=​0​;​ i ​<​ ​10​;​ i​++)
console​.​log​(​i​)

Código 35
let​ x​=​0​;
while​(​x ​<​ ​10​)
console​.​log​(​x​++)

Código 36
let​ x​=​0​;
do​{
console​.​log​(​x​)
}​ ​while​(​x​++​ ​<​ ​10​)

Código 37
let​ x​=​0
console​.​log​(​x​++)

Código 38
let​ x​=​0
console​.​log​(++​x​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 39
let​ x ​=​ ​0
if​(​x ​===​ ​0​)
console​.​log​(​'​X é zero!​'​)

Código 40
let​ x ​=​ ​0
if​(​x ​===​ ​0​)​{
console​.​log​(​'​X é zero!​'​)
x​++
}

Código 41
let​ x ​=​ ​0
if​(​x ​%​ ​2​ ​===​ ​0​)​{
console​.​log​(​'​X é PAR!​'​)
}

Código 42
for​(​var​ i​=​1​;​ i ​<=​ ​20​;​ i​++)​{
​if​(​i ​%​ ​2​ ​===​ ​0​)​{
console​.​log​(​i ​+​ ​'​ é PAR!​'​)
​}
}

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 43
for​(​var​ i​=​1​;​ i ​<=​ ​20​;​ i​++)​{
​if​(​i ​%​ ​2​ ​==​ ​0​)​{
console​.​log​(​i ​+​ ​'​ é PAR!​'​)
​}
console​.​log​(​i ​+​ ​'​ é ÍMPAR!​'​)

Código 44
for​(​var​ i​=​1​;​ i ​<=​ ​20​;​ i​++)​{
​if​(​i ​%​ ​2​ ​===​ ​0​)​{
console​.​log​(​i ​+​ ​'​ é PAR!​'​)
​}​ ​else​ ​{
console​.​log​(​i ​+​ ​'​ é ÍMPAR!​')​
​}
}

Código 45
for​(​var​ i​=​0​;​ i ​<​ ​10​;​ i​++)​{
​if​(​i ​>=​ ​5​)​{
​if​(​i ​<=​ ​7​)​{
console​.​log​(​'​FUNCIONOU​'​)
​}
​}
}

Código 46
for​(​var​ i​=​0​;​ i ​<​ ​10​;​ i​++)​{
​if​(​i ​>=​ ​5​ ​&&​ i ​<=​ ​7​)​{
console​.​log​(​'​FUNCIONOU​')​
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​}
}

Código 47
var​ letra ​=​ ​'​A​'
switch​ ​(​letra​)​ ​{
​case​ ​'​A​'​:​ console​.​log​(​'​Vogal A​'​)​;​ ​break
​case​ ​'​E​'​:​ console​.​log​(​'​Vogal E​'​)​;​ ​break
​case​ ​'​I​'​:​ console​.​log​(​'​Vogal I​')​ ​;​ ​break
​case​ ​'​O​'​:​ console​.​log​(​'​Vogal O​')​ ​;​ ​break
​case​ ​'​U​'​:​ console​.​log​(​'​Vogal U​')​ ​;​ ​break
​default​:​ console​.​log​(​'​Não é uma vogal​')​
}

Código 48
const​ numeros ​=​ ​[]

Código 49
numeros​[​0​]​ ​=​ ​5

Código 50
numeros​[​1​]​ ​=​ ​3

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 51
numeros​[​1​]​ ​=​ ​6

Código 52
const​ numeros ​=​ ​[]
numeros​[​0​]​ ​=​ ​8
numeros​[​1​]​ ​=​ ​4
numeros​[​2​]​ ​=​ ​29

Código 53
const​ inventores​=​ ​[]
inventores​[​0​]​ ​=​ ​'​Einstein​'
inventores​[​1​]​ ​=​ ​'​Edson​'
inventores​[​2​]​ ​=​ ​'​Galileu​'
inventores​[​3​]​ ​=​ ​'​Da Vinci​'

Código 54
const​ inventor ​=​ inventores​[​3​]
console​.​log​(​inventor​)

Código 55
const​ numeros ​=​ ​[]
for​(​var​ i​=​0​;​ i ​<​ ​10​;​ i​++)
numeros​[​i​]​ ​=​ ​1

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 56
const​ numeros ​=​ ​[]
for​(​var​ i​=​0​;​ i ​<​ ​10​;​ i​++)
numeros​.​push​(​1​)

Código 57
for​(​var​ i​=​0​;​ i ​<​ numeros​.​length​;​ i​++)
console​.​log​(​numeros​[​i​])

Código 58
const​ cliente ​=​ ​{}

Código 59
cliente​.​nome =
​ ​ ​'L
​ uiz​'

Código 60
cliente​.​exibirMensagem ​=​ ​function​(​msg​)​{
console​.​log​(​msg​)
}

Código 61
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
const​ cliente ​=​ ​{
nome​:​ ​'​Luiz​'​,
saldo​:​ ​100.0​,
idade​:​ ​29​,
gaucho​:​ ​true
}

Código 62
const​ clientes ​=​ ​[​cliente1​,​ cliente2​,​ ​{​ nome​:​”cliente3”​,​ saldo​:​5.0​,​ idade​:​21​,​ gaúcho​:​false​ ​}​]

Código 63
const​ http ​=​ require​(​'​http​'​)

Código 64
> ​require​(​'​http​'​).​METHODS
[​ ​'​ACL​'​,
​'​BIND​'​,
​'​CHECKOUT​'​,
​'​CONNECT​'​,
​'​COPY​'​,
​'​DELETE​'​,
​'​GET​'​,
​'​HEAD​'​,
​'​LINK​'​,
​'​LOCK​'​,
​'​M-SEARCH​'​,
​'​MERGE​'​,
​'​MKACTIVITY​'​,
​'​MKCALENDAR​'​,
​'​MKCOL​'​,
​'​MOVE​'​,
​'​NOTIFY​'​,
​'​OPTIONS​'​,
​'​PATCH​'​,
​'​POST​'​,
​'​PROPFIND​'​,

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​'​PROPPATCH​'​,
​'​PURGE​'​,
​'​PUT​'​,
​'​REBIND​'​,
​'​REPORT​'​,
​'​SEARCH​'​,
​'​SUBSCRIBE​'​,
​'​TRACE​'​,
​'​UNBIND​'​,
​'​UNLINK​'​,
​'​UNLOCK​'​,
​'​UNSUBSCRIBE​'​ ​]

Código 65
> ​require​(​'​http​'​).​STATUS_CODES
{​ ​'​100​'​:​ ​'​Continue​'​,
​'​101​'​:​ ​'​Switching Protocols​'​,
​'​102​'​:​ ​'​Processing​'​,
​'​200​'​:​ ​'​OK​'​,
​'​201​'​:​ ​'​Created​'​,
​'​202​'​:​ ​'​Accepted​'​,
​'​203​'​:​ ​'​Non-Authoritative Information​',​
​'​204​'​:​ ​'​No Content​'​,
​'​205​'​:​ ​'​Reset Content​'​,
​'​206​'​:​ ​'​Partial Content​'​,
​'​207​'​:​ ​'​Multi-Status​'​,
​'​208​'​:​ ​'​Already Reported​'​,
​'​226​'​:​ ​'​IM Used​'​,
​'​300​'​:​ ​'​Multiple Choices​'​,
​'​301​'​:​ ​'​Moved Permanently​',​
​'​302​'​:​ ​'​Found​'​,
​'​303​'​:​ ​'​See Other​'​,
​'​304​'​:​ ​'​Not Modified​'​,
​'​305​'​:​ ​'​Use Proxy​'​,
​'​307​'​:​ ​'​Temporary Redirect​'​,
​'​308​'​:​ ​'​Permanent Redirect​',​
​'​400​'​:​ ​'​Bad Request​'​,
​'​401​'​:​ ​'​Unauthorized​'​,
​'​402​'​:​ ​'​Payment Required​'​,
​'​403​'​:​ ​'​Forbidden​'​,
​'​404​'​:​ ​'​Not Found​'​,
​'​405​'​:​ ​'​Method Not Allowed​'​,
​'​406​'​:​ ​'​Not Acceptable​'​,
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​'​407​'​:​ ​'​Proxy Authentication Required​'​,
​'​408​'​:​ ​'​Request Timeout​'​,
​'​409​'​:​ ​'​Conflict​'​,
​'​410​'​:​ ​'​Gone​'​,
​'​411​'​:​ ​'​Length Required​'​,
​'​412​'​:​ ​'​Precondition Failed​'​,
​'​413​'​:​ ​'​Payload Too Large​'​,
​'​414​'​:​ ​'​URI Too Long​'​,
​'​415​'​:​ ​'​Unsupported Media Type​'​,
​'​416​'​:​ ​'​Range Not Satisfiable​',​
​'​417​'​:​ ​'​Expectation Failed​',​
​'​418​'​:​ ​'​I​\'​m a teapot​'​,
​'​421​'​:​ ​'​Misdirected Request​'​,
​'​422​'​:​ ​'​Unprocessable Entity​'​,
​'​423​'​:​ ​'​Locked​'​,
​'​424​'​:​ ​'​Failed Dependency​'​,
​'​425​'​:​ ​'​Unordered Collection​'​,
​'​426​'​:​ ​'​Upgrade Required​'​,
​'​428​'​:​ ​'​Precondition Required​',​
​'​429​'​:​ ​'​Too Many Requests​'​,
​'​431​'​:​ ​'​Request Header Fields Too Large​'​,
​'​451​'​:​ ​'​Unavailable For Legal Reasons​'​,
​'​500​'​:​ ​'​Internal Server Error​'​,
​'​501​'​:​ ​'​Not Implemented​'​,
​'​502​'​:​ ​'​Bad Gateway​'​,
​'​503​'​:​ ​'​Service Unavailable​'​,
​'​504​'​:​ ​'​Gateway Timeout​',​
​'​505​'​:​ ​'​HTTP Version Not Supported​'​,
​'​506​'​:​ ​'​Variant Also Negotiates​'​,
​'​507​'​:​ ​'​Insufficient Storage​'​,
​'​508​'​:​ ​'​Loop Detected​'​,
​'​509​'​:​ ​'​Bandwidth Limit Exceeded​'​,
​'​510​'​:​ ​'​Not Extended​'​,
​'​511​'​:​ ​'​Network Authentication Required​'​ ​}

Código 66
const​ server ​=​ http​.​createServer​((​req​,​ res​)​ ​=>​ ​{
​//cada requisição recebida dispara este callback
}​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 67
const​ server ​=​ http​.​createServer​((​req​,​ res​)​ ​=>​ ​{
​//res é um objeto http.ServerResponse
}​)

Código 68
response​.​statusCode ​=​ ​500
response​.​statusMessage ​=​ ​'​Internal Server Error​'

Código 69
const​ http ​=​ require​(​'​http​'​)
const​ port ​=​ ​3000
const​ server ​=​ http​.​createServer​((​req​,​ res​)​ ​=>​ ​{
res​.​statusCode ​=​ ​200
res​.​setHeader​(​'​Content-Type​'​,​ ​'t​ ext/plain​'​)
res​.​end​(​'​Olá Mundo!​\n​'​)
}​)
server​.​listen​(​port​,​ ​()​ ​=>​ ​{
console​.​log​(​`Servidor iniciou em http​:​//localhost:${port}/`)
}​)

Código 70
C:\Users\luiztools\documents> node servidor.js

Código 71

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
const​ https ​=​ require​(​'​https​'​)
const​ options ​=​ ​{
hostname​:​ ​'​www.google.com.br​'​,
port​:​ ​443​,
path​:​ ​'​/about/​'​,
method​:​ ​'​GET​'
}
const​ req ​=​ https​.​request​(​options​,​ ​(​res​)​ ​=>​ ​{
console​.​log​(​`statusCode​:​ $​{​res​.​statusCode​}​`​)
res​.​on​(​'​data​'​,​ ​(​d​)​ ​=>​ ​{
process​.​stdout​.​write​(​d​)
​}​)
}​)
req​.​on​(​'​error​'​,​ ​(​error​)​ ​=>​ ​{
console​.​error​(​error​)
}​)
req​.​end​()

Código 72
const​ https ​=​ require​(​'​https​'​)
const​ data ​=​ JSON​.​stringify​(​{
exemplo​:​ ​'​valor​'
}​)
const​ options ​=​ ​{
hostname​:​ ​'​requestbin.fullcontact.com​'​,
port​:​ ​443​,
path​:​ ​'​/14dbyg71​'​,
method​:​ ​'​POST​'​,
headers​:​ ​{
​'​Content-Type​'​:​ ​'​application/json​'​,
​'​Content-Length​'​:​ data​.​length
​}
}
const​ req ​=​ https​.​request​(​options​,​ ​(​res​)​ ​=>​ ​{
console​.​log​(​`statusCode​:​ $​{​res​.​statusCode​}​`​)
res​.​on​(​'​data​'​,​ ​(​d​)​ ​=>​ ​{
process​.​stdout​.​write​(​d​)
​}​)
}​)
req​.​on​(​'​error​'​,​ ​(​error​)​ ​=>​ ​{
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
console​.​error​(​error​)
}​)
req​.​write​(​data​)
req​.​end​()

Código 73
C:\node> npm install -g express-generator

Código 74
C:\node>express -e --git workshop

Código 75
cd workshop
npm install

Código 76
> npm start

Código 77
var​ app ​=​ require​(​'​../app​'​)​;
var​ debug ​=​ require​(​'​debug​'​)(​'w
​ orkshop:server​'​)​;
var​ http ​=​ require​(​'​http​'​)​;

var​ port ​=​ normalizePort​(​process​.​env​.​PORT ​||​ ​'​3000​'​)​;

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
app​.​set​(​'​port​'​,​ port​)​;

var​ server ​=​ http​.​createServer​(​app​)​;

server​.​listen​(​port​)​;
server​.​on​(​'​error​'​,​ onError​)​;
server​.​on​(​'​listening​'​,​ onListening​)​;

Código 78
var​ express ​=​ require​(​'​express​'​);​
var​ path ​=​ require​(​'​path​'​)​;
var​ favicon ​=​ require​(​'​serve-favicon​'​)​;
var​ logger ​=​ require​(​'​morgan​')​ ​;
var​ cookieParser ​=​ require​(​'c​ ookie-parser​'​)​;
var​ bodyParser ​=​ require​(​'​body-parser​')​ ​;

var​ ​index​ ​=​ require​(​'​./routes/index​'​)​;


var​ users ​=​ require​(​'​./routes/users​'​)​;

Código 79
var​ app ​=​ express​()​;

Código 80
// view engine setup
app​.​engine​(​'​html​'​,​ require​(​'​ejs​'​).​renderFile​)​;
app​.​set​(​'​views​'​,​ __dirname ​+​ ​'​/views​'​)​;
app​.​set​(​'​view engine​'​,​ ​'​ejs​'​)​;

// uncomment after placing your favicon in /public


//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app​.​use​(​logger​(​'​dev​'​))​;
app​.​use​(​bodyParser​.​json​())​;
app​.​use​(​bodyParser​.​urlencoded​(​{​ extended​:​ ​false​ ​}​))​;

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
app​.​use​(​cookieParser​())​;
app​.​use​(​express​.​static​(​path​.​join​(​__dirname​,​ ​'​public​'​)))​;

app​.​use​(​'​/​'​,​ ​index​)​;
app​.​use​(​'​/users​'​,​ users​)​;

Código 81
module.exports = app;

Código 82
// códigos…
var​ ​index​ ​=​ require​(​'​./routes/index​'​)​;
var​ users ​=​ require​(​'​./routes/users​'​)​;

// mais códigos...

app​.​use​(​'​/​'​,​ ​index​)​;
app​.​use​(​'​/users​'​,​ users​)​;

Código 83
var​ express ​=​ require​(​'​express​'​);​
var​ router ​=​ express​.​Router​()​;

router​.​get​(​'​/​'​,​ ​function​(​req​,​ res​,​ next​)​ ​{


res​.​render​(​'​index​'​,​ ​{​ title​:​ ​'​Express​'​ ​}​)​;
}​)​;

module​.​exports ​=​ router​;

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 84
res​.​render​(​'​index​'​,​ ​{​ title​:​ ​'​Express​'​ ​}​);​

Código 85
// view engine setup
app​.​engine​(​'​html​'​,​ require​(​'​ejs​'​).​renderFile​)​;
app​.​set​(​'​views​'​,​ __dirname ​+​ ​'​/views​'​)​;
app​.​set​(​'​view engine​'​,​ ​'​ejs​'​)​;

Código 86
<!DOCTYPE html>
<​html​>
​<​head​>
​<​title​>​<%= title %​></​title​>
​<​link​ ​rel​=​'stylesheet'​ ​href​=​'/stylesheets/style.css'​ ​/>
​</​head​>
​<​body​>
​<​h1​>​<%= title %​></​h1​>
​<​p​>​Welcome to <%= title %​></​p​>
​</​body​>
</​html​>

Código 87
res​.​render​(​'​index​'​,​ ​{​ title​:​ ​'​Express​'​ ​}​);​

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 88
var​ express ​=​ require​(​'​express​'​);​
var​ router ​=​ express​.​Router​()​;

router​.​get​(​'​/​'​,​ ​function​(​req​,​ res​,​ next​)​ ​{


res​.​render​(​'​new​'​,​ ​{​ title​:​ ​'​Novo Cadastro​'​ ​}​)​;
}​)​;

module​.​exports ​=​ router​;

Código 89
var​ ​new​ ​=​ require​(​'​./routes/new);
app.use(​'​/​new​'​, new);

Código 90
//coloque todo o conteúdo abaixo dentro de um arquivo index.js
//rode o comando "npm init" na mesma pasta do index.js e apenas aperte Enter para tudo
//rode os comandos "npm install -S express fs" para instalar as dependências
//use o comando "node index" na pasta do index.js para iniciar esse programa
const​ express ​=​ require​(​'​express​')​
const​ fs ​=​ require​(​'​fs​'​)​ ​//fs é o módulo file-system, para ler arquivos
const​ app ​=​ express​()

app​.​get​(​'​/​'​,​ processRequest​)

function​ processRequest ​(​request​,​ response​)​ ​{


readText​(​request​,​ response​)
console​.​log​(​'​requisição terminou​'​)
}

function​ readText ​(​request​,​ response​)​ ​{


​//salve um arquivo teste.txt junto a esse arquivo com qualquer coisa dentro
fs​.​readFile​(​'​teste.txt​'​,​ ​function​(​err​,​ data​)​ ​{
​if​ ​(​err​)​ ​{
console​.​log​(​'​erro na leitura​'​)
​return​ response​.​status​(​500​).​send​('​ ​Erro ao ler o arquivo.​'​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
}​
response​.​write​(​data​)
response​.​end​()​;
console​.​log​(​'​leu arquivo​')​
​}​)​;

console​.​log​(​'​Lendo o arquivo, aguarde.​'​)


}

app​.​listen​(​3000​)

Código 91
<!DOCTYPE html>
<​html​>
​<​head​>
<​title​>​Programação para Internet​</​title​>
<​meta​ ​charset​=​"utf-8"​ ​/>
​</​head​>
<​body​>
<% var teste = ​0​; %​>
<​p​>​Apenas um texto​</​p​>
<%= teste %​>
</​body​>
</​html​>

Código 92
<!DOCTYPE html>
<​html​>
​<​head​>
<​title​>​Programação para Internet​</​title​>
<​meta​ ​charset​=​"utf-8"​ ​/>
​</​head​>
<​body​>
<% if(exibirDiv) { %​>
​<​div​>​Apenas uma div​</​div​>
<% } else { %​>
<​div​>​Apenas outra div​</​div​>
<% } %​>
</​body​>
</​html​>

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 93
router​.​get​(​'​/​'​,​ ​function​(​req​,​ res​,​ next​){​
res​.​render​(​'​index​'​,​ ​{​ exibirDiv​:​ ​true​ ​}​)​;​//ou false, você escolhe
}​)

Código 94
express -e --git crud

Código 95
cd crud
npm install

Código 96
<!DOCTYPE html>
<​html​>
​<​head​>
​<​title​>​CRUD de Clientes​</​title​>
​<​link​ ​rel​=​'stylesheet'​ ​href​=​'/stylesheets/style.css'​ ​/>
​<​meta​ ​charset​=​"utf-8"​ ​/>
​</​head​>
​<​body​>
​<​h1​>​Listagem de Clientes​</​h1​>
​<​p​>​Clientes já cadastrados no sistema​.​</​p​>
​<​table​ ​style​=​"​width​:​50​%​"​>
​<​thead​>
​<​tr​ ​style​=​"​background-color​:​ ​#​CCC​"​>
​<​td​ ​style​=​"​width​:​50​%​"​>​Nome​</​td​>
​<​td​ ​style​=​"​width​:​15​%​"​>​Idade​</​td​>
​<​td​ ​style​=​"​width​:​15​%​"​>​UF​</​td​>
​<​td​>​Ações​</​td​>
​</​tr​>
​</​thead​>

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​<​tbody​>
​<​tr​>
​<​td​ ​colspan​=​"4"​>​Nenhum cliente cadastrado​.​</​td​>
​</​tr​>
​</​tbody​>
​<​tfoot​>
​<​tr​>
​<​td​ ​colspan​=​"4"​>
​<​a​ ​href​=​"/new"​>​Cadastrar Novo​</​a​>
​</​td​>
​</​tr​>
​</​tfoot​>
​</​table​>
​</​body​>
</​html​>

Código 97
<!DOCTYPE html>
<​html​>
​<​head​>
​<​title​>​CRUD de Clientes​</​title​>
​<​link​ ​rel​=​'stylesheet'​ ​href​=​'/stylesheets/style.css'​ ​/>
​<​meta​ ​charset​=​"utf-8"​ ​/>
​</​head​>
​<​body​>
​<​h1​>​<%= title %​></​h1​>
​<​p​>​Preencha os dados abaixo para salvar o cliente​.​</​p​>
​<​form​ ​action​=​"<%= action %>"​ ​method​=​"POST"​>
​<​p​>
​<​label​>​Nome: ​<​input​ ​type​=​"text"​ ​name​=​"nome"​ ​/></​label​>
​</​p​>
​<​p​>
​<​label​>​Idade: ​<​input​ ​type​=​"number"​ ​name​=​"idade"​ ​/></​label​>
​</​p​>
​<​p​>
​<​label​>​UF: ​<​select​ ​name​=​"uf"​>
​<​option​>​RS​</​option​>
​<​option​>​SC​</​option​>
​<​option​>​PR​</​option​>
​<!-- coloque os estados que quiser -->
​</​select​></​label​>
​</​p​>
​<​p​>
​<​a​ ​href​=​"/"​>​Cancelar​</​a​>​ | ​<​input​ ​type​=​"submit"​ ​value​=​"Salvar"​ ​/>
​</​p​>
​</​form​>

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​ /​body​>
<
</​html​>

Código 98
/* GET new page. */
router​.​get​(​'​/new​'​,​ ​function​(​req​,​ res​,​ next​)​ ​{
res​.​render​(​'​new​'​,​ ​{​ title​:​ ​"​Cadastro de Cliente​"​,​ action​:​ ​"​/new​"​ ​}​)
}​)

Código 99
/* POST new page. */
router​.​post​(​'​/new​'​,​ ​function​(​req​,​ res​,​ next​)​ ​{
​//futuramente vamos salvar o cliente aqui
res​.​redirect​(​'​/?new=true​'​)
}​)

Código 100
npm start

Código 101
C:\mongo\bin> mongod --dbpath C:\mongo\data

Código 102
c:\mongo\bin> mongo

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 103
show databases

Código 104
> use workshop

Código 105
> show collections

Código 106
> db.customers.find()

Código 107
> db.customers.insert({ nome: "Luiz", idade: 29 })

Código 108
> custArray = [{ nome : "Fernando", idade : 29 }, { nome : "Teste", "uf" : "RS" }]
> db.customers.insert(custArray)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 109
> db.customers.find().pretty()

Código 110
> db.customers.find({uf: "RS"})

Código 111
> db.customers.find({nome: { $regex: /a/ }})

Código 112
> db.customers.find({idade: {$gte: 18}})

Código 113
> db.customers.find({nome: "Luiz", idade: {$gte: 18}})

Código 114
> db.customers.find({nome: { $regex: /a/ }, idade: {$gte: 18}})

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 115
> db.customers.find().skip(1).limit(10)

Código 116
> db.customers.find().sort({idade: 1})

Código 117
> db.customers.update({nome: "Luiz"}, {nome: "Luiz", idade: 29, uf: "RS"})

Código 118
> db.customers.updateOne({_id: ObjectId("59ab46e433959e2724be2cbd")}, {$set: {idade:
28}})

Código 119
> db.customers.updateOne({nome: "LuizTools"}, {nome: "LuizTools", uf: "RS"}, {upsert:
true})

Código 120
> db.customers.delete({nome: "Luiz"})

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 121
npm install mongodb

Código 122
const​ mongoClient ​=​ require​(​"​mongodb​"​).​MongoClient
mongoClient​.​connect​(​"​mongodb://localhost:27017/workshop​"​)
​.​then​(​conn ​=>​ ​global​.​conn = ​ ​ conn.db("workshop")​)
​.​catch​(​err ​=>​ console​.​log​(​err​))

module​.​exports ​=​ ​{​ ​}

Código 123
conn ​=>​ ​global​.​conn ​=​ conn.db("workshop")

Código 124
global​.​db ​=​ require​(​'​../db​'​)

Código 125
function​ findAll​(​callback​)​{
​global​.​conn​.​collection​(​"​customers​"​).​find​(​{}​).​toArray​(​callback​)​;
}

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 126
module​.​exports ​=​ ​{​ findAll ​}

Código 127
/* GET home page. */
router​.​get​(​'​/​'​,​ ​function​(​req​,​ res​)​ ​{
​global​.​db​.​findAll​((​e​,​ docs​)​ ​=>​ ​{
​if​(​e​)​ ​{​ ​return​ console​.​log​(e​ ​)​;​ ​}
res​.​render​(​'​index​'​,​ ​{​ docs ​}​)​;
​}​)
}​)

Código 128

<% if(!docs || docs​.​length == ​0​) { %>


​<​tr​>
​<​td​ ​colspan​=​"4"​>​Nenhum cliente cadastrado​.​</​td​>
​</​tr​>
<% } %>

Código 129
<% } else {
docs​.​forEach(function(customer){ %>
​<​tr​>
​<​td​ ​style​=​"​width​:​50​%​"​>​<%= customer​.​nome %​></​td​>
​<​td​ ​style​=​"​width​:​15​%​"​>​<%= customer​.​idade %​></​td​>
​<​td​ ​style​=​"​width​:​15​%​"​>​<%= customer​.​uf %​></​td​>
​<​td​>​<!-- em breve -->​</​td​>
​</​tr​>

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
<% })
}%>

Código 130
npm start

Código 131
function​ insert​(​customer​,​ callback​)​{
​global​.​conn​.​collection​(​"​customers​"​).​insert​(​customer​,​ callback​)​;
}

Código 132
module​.​exports ​=​ ​{​ findAll​,​ insert ​}

Código 133
/* POST new page. */
router​.​post​(​'​/new​'​,​ ​function​(​req​,​ res​,​ next​)​ ​{
​const​ nome ​=​ req​.​body​.​nome
​const​ idade ​=​ ​parseInt​(​req​.​body​.​idade​)​;
​const​ uf ​=​ req​.​body​.​uf
​global​.​db​.​insert​(​{​nome​,​ idade​,​ uf​}​,​ ​(​err​,​ result​)​ ​=>​ ​{
​if​(​err​)​ ​{​ ​return​ console​.​log​(e
​ rr​)​ ​}
res​.​redirect​(​'​/?new=true​'​)
​}​)
}​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 134
<​td​><​a​ ​href​=​"/edit/<%= customer._id %>"​>​Editar​</​a​></​td​>

Código 135
const​ ObjectId ​=​ require​("​ ​mongodb​"​).​ObjectId​;
function​ findOne​(​id​,​ callback​){​
​global​.​conn​.​collection​(​"​customers​"​).​findOne​(​new​ ObjectId​(​id​),​ callback​)​;
}

Código 136
module​.​exports ​=​ ​{​ findAll​,​ insert​,​ findOne ​}

Código 137
/* GET edit page. */
router​.​get​(​'​/edit/:id​'​,​ ​function​(r​ eq​,​ res​,​ next​)​ ​{
​var​ id ​=​ req​.​params​.​id
​global​.​db​.​findOne​(​id​,​ ​(​e​,​ doc​)​ ​=>​ ​{
​if​(​e​)​ ​{​ ​return​ console​.​log​(e ​ ​)​ ​}
console​.​log​(​doc​.​nome​)
res​.​render​(​'​new​'​,​ ​{​ title​:​ ​'​Edição de Cliente​'​,​ doc​:​ doc​,​ action​:​ ​'​/edit/​'​ ​+​ doc​.​_id ​}​)
​}​)
}​)

Código 138

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
/* GET new page. */
router​.​get​(​'​/new​'​,​ ​function​(​req​,​ res​,​ next​)​ ​{
res​.​render​(​'​new​'​,​ ​{​ title​:​ ​'​Cadastro de Cliente​'​,​ doc​:​ ​{}​ ​}​)
}​)

Código 139
<​form​ ​action​=​"<%= action %>"​ ​method​=​"POST"​>
​<​p​>
​<​label​>​Nome: ​<​input​ ​type​=​"text"​ ​name​=​"nome"​ ​value​=​"<%= doc.nome %>"​ ​/></​label​>
​</​p​>
​<​p​>
​<​label​>​Idade: ​<​input​ ​type​=​"number"​ ​name​=​"idade"​ ​value​=​"<%= doc.idade %>"
/></​label​>
​</​p​>
​<​p​>
​<​label​>​UF: ​<​select​ ​name​=​"uf"​>
<% const s = "selected" %​>
​<​option​ <% if(doc​.​uf ​===​ ​"RS"​) { %​>​<%= s %​>​<% } %​>>​RS​</​option​>
​<​option​ <% if(doc​.​uf ​===​ ​"SC"​) { %​>​<%= s %​>​<% } %​>>​SC​</​option​>
​<​option​ <% if(doc​.​uf ​===​ ​"PR"​) { %​>​<%= s %​>​<% } %​>>​PR​</​option​>
​<!-- coloque os estados que quiser -->
​</​select​></​label​>
​</​p​>
​<​p​>
​<​a​ ​href​=​"/"​>​Cancelar​</​a​>​ | ​<​input​ ​type​=​"submit"​ ​value​=​"Salvar"​ ​/>
​</​p​>
</​form​>

Código 140
function​ update​(​id​,​ customer​,​ callback​)​{
​global​.​conn​.​collection​(​"​customers​"​).​update​(​{​_id​:​ ​new​ ObjectId​(​id​)​}​,​ customer​,​ callback​)​;
}

module​.​exports ​=​ ​{​ findAll​,​ insert​,​ findOne​,​ update ​}

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 141
/* POST edit page. */
router​.​post​(​'​/edit/:id​'​,​ ​function​(r​ eq​,​ res​)​ ​{
​const​ id ​=​ req​.​params​.​id
​const​ nome ​=​ req​.​body​.​nome
​const​ idade ​=​ ​parseInt​(​req​.​body​.​idade​)
​const​ uf ​=​ req​.​body​.​uf
​global​.​db​.​update​(​id​,​ ​{​nome​,​ idade​,​ uf​}​,​ ​(​e​,​ result​)​ ​=>​ ​{
​if​(​e​)​ ​{​ ​return​ console​.​log​(​e)​ ​ ​}
res​.​redirect​(​'​/?edit=true​')​
​}​)
}​)

Código 142
<​td​>
​<​a​ ​href​=​"/edit/<%= customer._id %>"​>​Editar​</​a​>
​<​a​ ​href​=​"/delete/<%= customer._id %>"​ ​onclick​=​"return confirm('Tem
certeza?');"​>​Excluir​</​a​>
</​td​>

Código 143
function​ deleteOne​(​id​,​ callback​)​{
​global​.​conn​.​collection​(​"​customers​"​).​deleteOne​(​{​_id​:​ ​new​ ObjectId​(​id​)​}​,​ callback​)​;
}

module​.​exports ​=​ ​{​ findAll​,​ insert​,​ findOne​,​ update​,​ deleteOne ​}

Código 144
/* GET delete page. */
router​.​get​(​'​/delete/:id​'​,​ ​function​(​req​,​ res​)​ ​{
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​var​ id ​=​ req​.​params​.​id
​global​.​db​.​deleteOne​(​id​,​ ​(​e,​ ​ r​)​ ​=>​ ​{
​if​(​e​)​ ​{​ ​return​ console​.​log​(​e)​ ​ ​}
res​.​redirect​(​'​/?delete=true​'​)
​}​)
}​)

Código 145
<script>
if​(​location​.​href​.​indexOf​('​ ​delete=true​'​)​ ​!=​ ​-​1​)​{
​alert​(​'​Cliente excluído com sucesso!​'​)​;
​}
​else​ ​if​(​location​.​href​.​indexOf​(​'​edit=true​'​)​ ​!=​ ​-​1​)​{
​alert​(​'​Cliente editado com sucesso!​'​)​;
​}
​else​ ​if​(​location​.​href​.​indexOf​(​'​new=true​'​)​ ​!=​ ​-​1​)​{
​alert​(​'​Cliente cadastro com sucesso!​'​)​;
​}
</script>

Código 146
npm init

Código 147
npm i express mongodb body-parser

Código 148
const​ mongoClient ​=​ require​(​"​mongodb​"​).​MongoClient
mongoClient​.​connect​(​'​mongodb://localhost/workshop​'​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
.​then​(​conn ​=>​ ​global​.​conn =​ ​ conn.db("workshop")​)
.​catch​(​err ​=>​ console​.​log​(​err​))

module​.​export​ ​=​ ​{}

Código 149
global​.​db ​=​ require​(​'​./db​'​)
const​ express ​=​ require​(​'​express​')​
const​ app ​=​ express​()
const​ bodyParser ​=​ require​(​'b ​ ody-parser​'​)
const​ port ​=​ ​3000​ ​//porta padrão

Código 150
app​.​use​(​bodyParser​.​urlencoded​(​{​ extended​:​ ​true​ ​}​))
app​.​use​(​bodyParser​.​json​())

Código 151
//definindo as rotas
const​ router ​=​ express​.​Router​()
router​.​get​(​'​/​'​,​ ​(​req​,​ res​)​ ​=>​ res​.​json​(​{​ message​:​ ​'​Funcionando!​'​ ​}​))
app​.​use​(​'​/​'​,​ router​)

Código 152
//inicia o servidor
app​.​listen​(​port​)
console​.​log​(​'​API funcionando!​')​

Código 153
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
node app

Código 154
function​ findCustomers​(​callback​)​{
global​.​conn​.​collection​('​ ​customers​'​).​find​().​toArray​(​callback​)
}

module​.​exports ​=​ ​{​findCustomers​}

Código 155
// GET /clientes
router​.​get​(​'​/clientes​'​,​ ​(​req​,​ res​)​ ​=>​ ​global​.​db​.​findCustomers​((​err​,​ docs​)​ ​=>​ ​{
​if​(​err​)​ res​.​status​(​500​).​json​(​err​)
​else​ res​.​json​(​docs​)
}​))

Código 156
const​ ObjectId ​=​ require​("​ ​mongodb​"​).​ObjectId
function​ findCustomer​(​id​,​ callback​)​{
global​.​conn​.​collection​('​ ​customers​'​).​findOne​(​new​ ObjectId​(​id​),​ callback​)
}

module​.​exports ​=​ ​{​findCustomers​,​ findCustomer​}

Código 157
// GET /clientes/{id}
router​.​get​(​'​/clientes/:id​'​,​ ​(​req​,​ res​)​ ​=>​ ​global​.​db​.​findCustomer​(​req​.​params​.​id​,​ ​(​err​,​ doc​)​ ​=>​ ​{
​if​(​err​)​ res​.​status​(​500​).​json​(​err​)
​else​ res​.​json​(​doc​)
}​))

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 158
function​ insertCustomer​(​customer​,​ callback​)​{
global​.​conn​.​collection​('​ ​customers​'​).​insert​(​customer​,​ callback​)
}

module​.​exports ​=​ ​{​findCustomers​,​ findCustomer​,​ insertCustomer​}

Código 159
// POST /clientes
router​.​post​(​'​/clientes​'​,​ ​(​req​,​ res​)​ ​=>​ ​{
​const​ customer ​=​ req​.​body
​global​.​db​.​insertCustomer​(c​ ustomer​,​ ​(​err​,​ result​)​ ​=>​ ​{
​if​(​err​)​ res​.​status​(​500​).​json​(​err​)
​else​ res​.​json​(​{​ message​:​ ​'​Cliente cadastrado com sucesso!​'​}​)
​}​)
}​)

Código 160
curl -X POST -d "{'nome':'Curl', 'idade': 11, 'uf': 'RJ'}" http://localhost:3000/clientes

Código 161
function​ updateCustomer​(​id​,​ customer​,​ callback​)​{
global​.​conn​.​collection​('​ ​customers​'​).​update​(​{​_id​:​ ​new​ ObjectId​(​id​)​},​ ​ customer​,
callback​)
}

module​.​exports ​=​ ​{​findCustomers​,​ findCustomer​,​ insertCustomer​,​ updateCustomer​}

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 162
// PUT /clientes/{id}
router​.​put​(​'​/clientes/:id​'​,​ ​(​req​,​ res​)​ ​=>​ ​{
​const​ id ​=​ req​.​params​.​id
​const​ customer ​=​ req​.​body
​global​.​db​.​updateCustomer​(i​ d​,​ customer​,​ ​(​err​,​ result​)​ ​=>​ ​{
​if​(​err​)​ res​.​status​(​500​).​json​(​err​)
​else​ res​.​json​(​{​ message​:​ ​'​Cliente atualizado com sucesso!​'​}​)
​}​)
}​)

Código 163
curl -X PUT -d "{'nome':'Postman', 'idade': 20, 'uf': 'SP'}"
http://localhost:3000/clientes/59ac8350e07d4f10cf6a74f6

Código 164
function​ patchCustomer​(​id​,​ updates​,​ callback​)​{
global​.​conn​.​collection​('​ ​customers​'​).​update​(​{​_id​:​ ​new​ ObjectId​(​id​)​},​ ​ ​{​ $set​:​ updates ​}​,
callback​)
}

module​.​exports ​=​ ​{​findCustomers​,​ findCustomer​,​ insertCustomer​,​ updateCustomer​,


patchCustomer​}

Código 165
// PATCH /clientes/{id}
router​.​patch​(​'​/clientes/:id​'​,​ ​(​req​,​ res​)​ ​=>​ ​{
​const​ id ​=​ req​.​params​.​id
​const​ updates ​=​ req​.​body
​global​.​db​.​patchCustomer​(​id​,​ updates​,​ ​(​err​,​ result​)​ ​=>​ ​{
​if​(​err​)​ res​.​status​(​500​).​json​(​err​)
​else​ res​.​json​(​{​ message​:​ ​'​Cliente atualizado com sucesso!​'​}​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​}​)
}​)

Código 166
curl -X PATCH -d "{'nome':'POSTMAN'}"
http://localhost:3000/clientes/59ac8350e07d4f10cf6a74f6

Código 167
function​ deleteCustomer​(​id​,​ callback​){​
global​.​conn​.​collection​('​ ​customers​'​).​deleteOne​(​{​_id​:​ ​new​ ObjectId​(​id​)​},​ ​ callback​)
}

module​.​exports ​=​ ​{​findCustomers​,​ findCustomer​,​ insertCustomer​,​ updateCustomer​,


patchCustomer​,​ deleteCustomer​}

Código 168
// DELETE /clientes/{id}
router​.​delete​(​'​/clientes/:id​'​,​ ​(​req​,​ res​)​ ​=>​ ​{
​const​ id ​=​ req​.​params​.​id
​global​.​db​.​deleteCustomer​(i​ d​,​ ​(​err​,​ result​)​ ​=>​ ​{
​if​(​err​)​ res​.​status​(​500​).​json​(​err​)
​else​ res​.​json​(​{​ message​:​ ​'​Cliente excluído com sucesso!​'​}​)
​}​)
}​)

Código 169
curl -X DELETE http://localhost:3000/clientes/59ac8350e07d4f10cf6a74f6

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 170
function​ aplicarDescontoTest​()​{
​return​ aplicarDesconto​(​10​,​2)​ ​ ​===​ ​8
}

console​.​log​(​'​A aplicação de desconto está funcionando? ​'​)


console​.​log​(​aplicarDescontoTest​())

Código 171
function​ aplicarDesconto​(​valor​,​ desconto​)​{
​return​ valor ​-​ desconto
}

Código 172
function​ aplicarDescontoGrandeTest​()​{
​return​ aplicarDesconto​(​1​,​10​)​ ​===​ ​0
}

console​.​log​(​'​A aplicação de desconto grande está funcionando? ​'​)


console​.​log​(​aplicarDescontoGrandeTest​())

Código 173
function​ aplicarDesconto​(​valor​,​ desconto​)​{
​if​(​desconto ​>​ valor​)​ ​return​ ​0
​return​ valor ​-​ desconto
}

Código 174
npm init

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 175
node index.test

Código 176
{
​"​name​"​:​ ​"​exemplotdd​"​,
​"​version​"​:​ ​"​1.0.0​"​,
​"​description​"​:​ ​""​,
​"​main​"​:​ ​"​index.js​"​,
​"​scripts​"​:​ ​{
​"​test​"​:​ ​"​node index.test​"
​}​,
​"​author​"​:​ ​"​LuizTools​"​,
​"​license​"​:​ ​"​ISC​"
}

Código 177
npm test

Código 178
npm install tape

Código 179
const​ ​test​ ​=​ require​(​'​tape​'​)
const​ ​index​ ​=​ require​(​'​./index​')​

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 180
test​(​'​Aplicar desconto​'​,​ ​(​t​)​ ​=>​ ​{
t​.​assert​(​index​.​aplicarDesconto​(1 ​ 0​,​5​)​ ​===​ ​5​,​ ​"​Descontou corretamente​")​
t​.​end​()
}​)

Código 181
function​ aplicarDesconto​(​valor​,​ desconto​)​{
​if​(​desconto ​>​ valor​)​ ​return​ ​0
​return​ valor ​-​ desconto
}

module​.​exports ​=​ ​{​aplicarDesconto​}

Código 182
"test": "node index.test | tap-spec"

Código 183
test​(​'​Aplicar desconto grande​'​,​ ​(t​ ​)​ ​=>​ ​{
t​.​assert​(​index​.​aplicarDesconto​(5 ​ ​,​10​)​ ​===​ ​0​,​ ​"​Descontou corretamente​")​
t​.​end​()
}​)

Código 184
npm install supertest express body-parser

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 185
//app.js
const​ ​index​ ​=​ require​(​'​./index​')​
const​ express ​=​ require​(​'​express​')​
const​ app ​=​ express​()
const​ bodyParser ​=​ require​(​'b ​ ody-parser​'​)
const​ port ​=​ ​3000​ ​//porta padrão

//configurando o body parser para interpretar requests mais tarde


app​.​use​(​bodyParser​.​urlencoded​(​{​ extended​:​ ​true​ ​}​))​;
app​.​use​(​bodyParser​.​json​())​;

//definindo as rotas
const​ router ​=​ express​.​Router​()​;
router​.​get​(​'​/​'​,​ ​(​req​,​ res​)​ ​=>​ res​.​json​(​{​ message​:​ ​'​Funcionando!​'​ ​}​))​;

// GET /aplicarDesconto
router​.​get​(​'​/aplicarDesconto/:valor/:desconto​'​,​ ​(​req​,​ res​)​ ​=>​ ​{
​const​ valor ​=​ ​parseInt​(r​ eq​.​params​.​valor​)
​const​ desconto ​=​ ​parseInt​(​req​.​params​.​desconto​)
res​.​json​(​{​valorDescontado​:​ ​index​.​aplicarDesconto​(​valor​,​desconto​)​}​)
}​)

app​.​use​(​'​/​'​,​ router​)

if​ ​(​require​.​main ​===​ module​)​{


​//inicia o servidor
app​.​listen​(​port​)
console​.​log​(​'​API funcionando!​')​
}

module​.​exports ​=​ app

Código 186
const​ ​test​ ​=​ require​(​'​tape​'​)
const​ supertest ​=​ require​(​'​supertest​'​)
const​ app ​=​ require​(​'​./app​'​)

Código 187

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
test​(​'​GET /aplicarDesconto/10/5​',​ ​ ​(​t​)​ ​=>​ ​{
supertest​(​app​)
​.​get​(​'​/aplicarDesconto/10/5​'​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
t​.​error​(​err​,​ ​'​Sem erros​'​)
t​.​assert​(​res​.​body​.​valorDescontado ​===​ ​5​,​ ​"​Desconto correto​"​)
t​.​end​()
​}​)
}​)

Código 188
"test": "node ./tests/* | tap-spec"

Código 189
npm install express mongodb dotenv-safe tape tap-spec helmet morgan

Código 190
const​ MongoClient ​=​ require​(​"​mongodb​"​).​MongoClient​;
var​ connection ​=​ ​null​;
var​ db ​=​ ​null​;

function​ connect​(​callback​){​
​if​(​connection​)​ ​return​ callback​(n
​ ull​,​ db​)​;

MongoClient​.​connect​(​process​.​env​.​MONGO_CONNECTION​,​ ​(​err​,​ conn​)​ ​=>​ ​{


​if​(​err​)
​return​ callback​(​err​,​ ​null​)​;
​else​ ​{
connection ​=​ conn​;
db ​=​ conn​.​db​(​process​.​env​.​DATABASE_NAME​)​;
​return​ callback​(​null​,​ db​);​
​}
​}​)
}

function​ disconnect​()​{
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
i​ f​(!​connection​)​ ​return​ ​true​;
connection​.​close​()​;
connection ​=​ ​null​;
​return​ ​true​;
}

module​.​exports ​=​ ​{​ connect​,​ disconnect ​}

Código 191
#.env, don't commit to repo
MONGO_CONNECTION=mongodb://localhost:27017
DATABASE_NAME=movie-service
PORT=3000

Código 192
#.env.example, commit to repo
MONGO_CONNECTION=
DATABASE_NAME=
PORT=

Código 193
const​ ​test​ ​=​ require​(​'​tape​'​)​;
const​ mongodb ​=​ require​(​'​./mongodb​')​ ​;

function​ runTests​()​{
​test​(​'​MongoDB Connection​'​,​ ​(​t​)​ ​=>​ ​{
mongodb​.​connect​((​err​,​ conn​)​ ​=>​ ​{
t​.​assert​(​conn​,​ ​"​Connection established​"​)​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​MongoDB Disconnection​',​ ​ ​(​t​)​ ​=>​ ​{


t​.​assert​(​mongodb​.​disconnect​(),​ ​"D
​ isconnected​"​)​;
t​.​end​()​;
​}​)
}

module​.​exports ​=​ ​{​ runTests ​}


Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 194
require​(​"​dotenv-safe​"​).​config​()​;
require​(​"​./config/mongodb.test​"​).​runTests​()​;

Código 195
{
"​ ​name​":​ ​ ​"​movie-service​",​
"​ ​version​":​ ​ "​ ​1.0.0"​ ​,
"​ ​description"​ :​ ​ ​"S ​ ervice to provide detailed movies info."​ ,​
"​ ​main​":​ ​ ​"​index.js​",​
"​ ​scripts"​ ​:​ {​
​"​start"​ :​ ​ ​"n
​ ode index"​ ,​
​"​test​":​ ​ ​"​node index.test | tap-spec​"
}​ ,​
"​ ​author​":​ ​ "​ ",​
"​ ​license"​ ​:​ "​ I​ SC"​ ​,
"​ ​dependencies​":​ ​ ​{
​"​express"​ ​:​ ​"^​ 4.16.3​",​
​"​mongodb"​ ​:​ ​"^​ 3.0.7"​ ​,
​"​tap-spec"​ :​ ​ ​"^​ 4.1.1​",​
​"​tape"​ ​:​ ​"^​ 4.9.0"​
}​
}

Código 196

/movie-service/src> npm test

Código 197

const​ mongodb ​=​ require​(​"​../config/mongodb​"​)​;

function​ getAllMovies​(​callback​)​{
mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{
db​.​collection​(​"​movies​"​).​find​().​toArray​(​callback​)​;
​}​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
}

function​ getMovieById​(​id​,​ callback​)​{


mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{
db​.​collection​(​"​movies​"​).​findOne​(​{​_id​:​ require​(​"​mongodb​"​).​ObjectId​(​id​)​},​ ​ callback​)​;
​}​)​;
}

function​ getMoviePremiers​(​callback​)​{

​var​ monthAgo ​=​ ​new​ ​Date​()​;


monthAgo​.​setMonth​(​monthAgo​.​getMonth​()​ ​-​ ​1​)​;
monthAgo​.​setHours​(​0​,​ ​0​,​ ​0​)​;
monthAgo​.​setMilliseconds​(​0​)​;

mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{


db​.​collection​(​"​movies​"​).​find​(​{​ dataLancamento​:​ ​{​ $gte​:​ monthAgo ​}​ ​}​).​toArray​(​callback​)​;
​}​)​;
}

function​ disconnect​()​{
​return​ mongodb​.​disconnect​()​;
}

module​.​exports ​=​ ​{​ getAllMovies​,​ getMovieById​,​ getMoviePremiers​,​ disconnect ​}

Código 198
const​ ​test​ ​=​ require​(​'​tape​'​)​;
const​ repository ​=​ require​(​'​./repository​')​ ​;

function​ runTests​()​{

​var​ id ​=​ ​null​;

​test​(​'​Repository GetAllMovies​'​,​ ​(​t​)​ ​=>​ ​{


repository​.​getAllMovies​((​err​,​ movies​)​ ​=>​ ​{
​if​(​movies ​&&​ movies​.​length​ ​>​ ​0)​ ​ id ​=​ movies​[​0​].​_id​;

t​.​assert​(!​err ​&&​ movies ​&&​ movies​.​length​ ​>​ ​0​,​ ​"​All Movies Returned​")​ ​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​Repository GetMovieById​',​ ​ ​(​t​)​ ​=>​ ​{


​if​(!​id​)​ ​{
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
t​.​assert​(​false​,​ ​"​Movie by Id Returned​"​)​;
t​.​end​()​;
​return​;
​}

repository​.​getMovieById​(​id​,​ ​(e ​ rr​,​ movie​)​ ​=>​ ​{


t​.​assert​(!​err ​&&​ movie​,​ ​"​Movie by Id Returned​"​)​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​Repository GetMoviePremiers​'​,​ ​(​t​)​ ​=>​ ​{


repository​.​getMoviePremiers​((​err​,​ movies​)​ ​=>​ ​{
t​.​assert​(!​err ​&&​ movies ​&&​ movies​.​length​ ​>​ ​0​,​ ​"​Movie Premiers Returned​"​)​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​Repository Disconnect​'​,​ ​(​t​)​ ​=>​ ​{


t​.​assert​(​repository​.​disconnect​(),​ ​"D​ isconnect Ok​"​)​;
t​.​end​()​;
​}​)
}

module​.​exports ​=​ ​{​ runTests ​}

Código 199
require​(​"​dotenv-safe​"​).​config​()​;
require​(​"​./config/mongodb.test​"​).​runTests​()​;
require​(​"​./repository/repository.test​"​).​runTests​()​;

Código 200
db​.​movies​.​insert​([​{
titulo​:​ ​"​Os Vingadores: Guerra Infinita​"​,
sinopse​:​ ​"​Os heróis mais poderosos da Marvel enfrentando o Thanos​"​,
duracao​:​ ​120​,
dataLancamento​:​ ISODate​(​"​2018-05-01T00:00:00Z​"​),

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
imagem​:​ ​"​http://www.luiztools.com.br/vingadores-gi.jpg​"​,
categorias​:​ ​[​"​Aventura​"​,​ ​"​Ação​"​]
}​,
{
titulo​:​ ​"​Os Vingadores: Era de Ultron​"​,
sinopse​:​ ​"​Os heróis mais poderosos da Marvel enfrentando o Ultron​"​,
duracao​:​ ​110​,
dataLancamento​:​ ISODate​(​"​2016-05-01T00:00:00Z​"​),
imagem​:​ ​"​http://www.luiztools.com.br/vingadores-eu.jpg​"​,
categorias​:​ ​[​"​Aventura​"​,​ ​"​Ação​"​]
}​,
{
titulo​:​ ​"​Os Vingadores​"​,
sinopse​:​ ​"​Os heróis mais poderosos da Marvel enfrentando o Loki​"​,
duracao​:​ ​100​,
dataLancamento​:​ ISODate​(​"​2014-05-01T00:00:00Z​"​),
imagem​:​ ​"​http://www.luiztools.com.br/vingadores.jpg​"​,
categorias​:​ ​[​"​Aventura​"​,​ ​"​Ação​"​]
}​])

Código 201
const​ express ​=​ require​(​'​express​')​ ​;
const​ morgan ​=​ require​(​'​morgan​'​)​;
const​ helmet ​=​ require​(​'​helmet​')​ ​;
var​ server ​=​ ​null​;

function​ start​(​api​,​ repository​,​ callback​)​{

​const​ app ​=​ express​()​;


app​.​use​(​morgan​(​'​dev​'​))​;
app​.​use​(​helmet​())​;
app​.​use​((​err​,​ req​,​ res​,​ next​)​ ​=>​ ​{
callback​(​new​ Error​(​'​Something went wrong!, err:​'​ ​+​ err​),​ ​null​)​;
res​.​status​(​500​).​send​(​'​Something went wrong!​'​)​;
​}​)

api​(​app​,​ repository​)​;

server ​=​ app​.​listen​(​parseInt​(​process​.​env​.​PORT​),​ ​()​ ​=>​ callback​(​null​,​ server​))​;


}

function​ stop​()​{

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​if​(​server​)​ server​.​close​()​;
​return​ ​true​;
}

module​.​exports ​=​ ​{​ start​,​ stop ​}

Código 202
const​ ​test​ ​=​ require​(​'​tape​'​)​;
const​ server ​=​ require​(​'​./server​')​ ​;

function​ apiMock​(​app​,​ repo​){​


console​.​log​(​"​do nothing​"​)​;
}

function​ runTests​()​{

​test​(​'​Server Start​'​,​ ​(​t​)​ ​=>​ ​{


server​.​start​(​apiMock​,​ ​null​,​ ​(​err​,​ srv​)​ ​=>​ ​{
t​.​assert​(!​err ​&&​ srv​,​ ​"S
​ erver started​"​)​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​Server Stop​'​,​ ​(​t​)​ ​=>​ ​{


t​.​assert​(​server​.​stop​(),​ ​"​Server stopped​"​)​;
t​.​end​()​;
​}​)
}

module​.​exports ​=​ ​{​ runTests ​}

Código 203
require​(​"​dotenv-safe​"​).​config​()​;
require​(​"​./config/mongodb.test​"​).​runTests​()​;
require​(​"​./repository/repository.test​"​).​runTests​()​;
require​(​"​./server/server.test​"​).​runTests​()​;

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 204
module​.​exports ​=​ ​(​app​,​ repository​)​ ​=>​ ​{

app​.​get​(​'​/movies​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getAllMovies​((​err​,​ movies​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​);​
res​.​json​(​movies​)​;
​}​)​;
​}​)

app​.​get​(​'​/movies/premieres​'​,​ ​(r​ eq​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getMoviePremiers​((​err​,​ movies​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​);​
res​.​json​(​movies​)
​}​)​;
​}​)

app​.​get​(​'​/movies/:id​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getMovieById​(​req​.​params​.​id​,​ ​(​err​,​ movie​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​);​
res​.​json​(​movie​)
​}​)​;
​}​)
}

Código 205
const​ ​test​ ​=​ require​(​'​tape​'​)​;
const​ supertest ​=​ require​(​'​supertest​'​)​;
const​ movies ​=​ require​(​'​./movies​'​)​;
const​ server ​=​ require​(​"​../server/server​")​ ​;
const​ repository ​=​ require​(​"​../repository/repository​"​)​;

function​ runTests​()​{

​var​ app ​=​ ​null​;


server​.​start​(​movies​,​ repository​,​ ​(e ​ rr​,​ app​)​ ​=>​ ​{
​var​ id ​=​ ​null​;
​test​(​'​GET /movies​'​,​ ​(t​ ​)​ ​=>​ ​{
supertest​(​app​)
​.​get​(​'​/movies​'​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​if​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​)​ id ​=​ res​.​body​[​0​].​_id​;
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​,​ ​"​All Movies returned​"​)
t​.​end​()
​}​)
​}​)

​test​(​'​GET /movies/:id​'​,​ ​(t​ ​)​ ​=>​ ​{


​if​(!​id​)​ ​{
t​.​assert​(​false​,​ ​"​Movie by Id Returned​"​)​;
t​.​end​()​;
​return​;
​}

supertest​(​app​)
​.​get​(​'​/movies/​'​ ​+​ id​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body​,​ ​"​Movies By Id returned​"​)
t​.​end​()
​}​)
​}​)

​test​(​'​GET /movies/premieres​'​,​ ​(​t​)​ ​=>​ ​{


supertest​(​app​)
​.​get​(​'​/movies/premieres​')​
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​,​ ​"​Premiere Movies returned​"​)
t​.​end​()
​}​)
​}​)

server​.​stop​()​;
​}​)
}

module​.​exports ​=​ ​{​ runTests ​}

Código 206
require​(​"​dotenv-safe​"​).​config​()​;
const​ movies ​=​ require​(​'​./api/movies​')​ ​;
const​ server ​=​ require​(​"​./server/server​"​)​;
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
const​ repository ​=​ require​(​"​./repository/repository​"​)​;

server​.​start​(​movies​,​ repository​,​ ​(e


​ rr​,​ app​)​ ​=>​ ​{
console​.​log​(​"​just started​"​)​;
}​)​;

Código 207
{
​"​name​"​:​ ​"​cinema-catalog-service​"​,
​"​version​"​:​ ​"​1.0.0​"​,
​"​description​"​:​ ​"​Provide cinema catalog info.​"​,
​"​main​"​:​ ​"​index.js​"​,
​"​scripts​"​:​ ​{
​"​start​"​:​ ​"​node index​"​,
​"​test​"​:​ ​"​echo ​\"​Error: no test specified​\"​ && exit 1​"
​}​,
​"​author​"​:​ ​"​LuizTools​"​,
​"​license​"​:​ ​"​ISC​"
}

Código 208
npm install express morgan tape mongodb helmet supertest dotenv-safe

Código 209
{
_id​:​ ObjectId​(​"​sasacsa85s7sdc7sd​"​),
cidade​:​ ​"​Porto Alegre​"​,
uf​:​ ​"​RS​"​,
pais​:​ ​"​BR​"​,
cinemas​:​ ​[
​{
_id​:​ ObjectId​(​"​68df5gd5g6ddf​")​ ,
nome​:​ ​"​Cinemark Bourbon Ipiranga​"​,
salas​:​ ​[
​{
nome​:​ ​1​,
sessoes​:​ ​[
​{
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
data​:​ ISODate​("​ ​2018-06-01T09:00:00Z​"​),
idFilme​:​ ObjectId​(​"​9ds68dsvdsvs876v​"​),
filme​:​ ​"​Vingadores: Guerra Infinita​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1,​ ​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2,​ ​ disponivel​:​ ​false​ ​}​,
​]
​}​,
{​
data​:​ ISODate​("​ ​2018-06-01T11:00:00Z​"​),
idFilme​:​ ObjectId​(​"​9ds68dsvdsvs876v​"​),
filme​:​ ​"​Vingadores: Guerra Infinita​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1,​ ​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2,​ ​ disponivel​:​ ​true​ ​}​,
​]
​}
​]
​}
​]
​}
​]
}

Código 209
./mongod --dbpath /pasta-do-seu-microservice/data --port 27018

Código 210
./mongo --port 27018

Código 211
use cinema-catalog-service

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 212
db​.​cinemaCatalog​.​insert​([
{
cidade​:​ ​"​Gravataí​"​,
uf​:​ ​"​RS​"​,
cinemas​:​ ​[]
}​,
{
cidade​:​ ​"​Porto Alegre​"​,
uf​:​ ​"​RS​"​,
pais​:​ ​"​BR​"​,
cinemas​:​ ​[
​{
_id​:​ ObjectId​(),
nome​:​ ​"​Cinemark Bourbon Ipiranga​"​,
salas​:​ ​[
​{
nome​:​ ​1​,
sessoes​:​ ​[
​{
data​:​ ISODate​(​"​2018-06-01T09:00:00Z​"​),
idFilme​:​ ObjectId​("​ ​5aefc5029ce83b1eb6b89e57​"​),
filme​:​ ​"​Vingadores: Guerra Infinita​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​false​ ​}​,
​]
​}​,
​{
data​:​ ISODate​(​"​2018-06-01T11:00:00Z​"​),
idFilme​:​ ObjectId​("​ ​5aefc5029ce83b1eb6b89e57​"​),
filme​:​ ​"​Vingadores: Guerra Infinita​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​true​ ​}​,
​]
​}​,
​{
data​:​ ISODate​(​"​2018-06-01T13:00:00Z​"​),
idFilme​:​ ObjectId​(​"5 ​ aefc5029ce83b1eb6b89e58​"​),
filme​:​ ​"​Vingadores: Era de Ultron​"​,
valor​:​ ​20.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​false​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​true​ ​}​,
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​]
​}
​]
​}​,
{​
nome​:​ ​2​,
sessoes​:​ ​[
​{
data​:​ ISODate​(​"​2018-06-01T09:00:00Z​"​),
idFilme​:​ ObjectId​("​ ​5aefc5029ce83b1eb6b89e58​"​),
filme​:​ ​"​Vingadores: Era de Ultron​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​false​ ​}​,
​]
​}​,
​{
data​:​ ISODate​(​"​2018-06-01T11:00:00Z​"​),
idFilme​:​ ObjectId​("​ ​5aefc5029ce83b1eb6b89e58​"​),
filme​:​ ​"​Vingadores: Era de Ultron​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​true​ ​}​,
​]
​}​,
​{
data​:​ ISODate​(​"​2018-06-01T13:00:00Z​"​),
idFilme​:​ ObjectId​(​"5 ​ aefc5029ce83b1eb6b89e58​"​),
filme​:​ ​"​Vingadores: Era de Ultron​"​,
valor​:​ ​20.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​false​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​true​ ​}​,
​]
​}
]​
​}
​]
​}​,
{​
_id​:​ ObjectId​(),
nome​:​ ​"​GNC Lindóia​"​,
salas​:​ ​[
​{
nome​:​ ​100​,
sessoes​:​ ​[
​{
data​:​ ISODate​(​"​2018-06-01T09:00:00Z​"​),

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
idFilme​:​ ObjectId​(​"5 ​ aefc5029ce83b1eb6b89e59​"​),
filme​:​ ​"​Os Vingadores​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​false​ ​}​,
]​
​}​,
{​
data​:​ ISODate​(​"​2018-06-01T11:00:00Z​"​),
idFilme​:​ ObjectId​(​"5 ​ aefc5029ce83b1eb6b89e59​"​),
filme​:​ ​"​Os Vingadores​"​,
valor​:​ ​25.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​true​ ​}​,
]​
​}​,
{​
data​:​ ISODate​(​"​2018-06-01T13:00:00Z​"​),
idFilme​:​ ObjectId​("​ ​5aefc5029ce83b1eb6b89e58​"​),
filme​:​ ​"​Vingadores: Era de Ultron​"​,
valor​:​ ​20.00​,
assentos​:​ ​[
​{​ numero​:​ ​1​,​ disponivel​:​ ​true​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​false​ ​}​,
​{​ numero​:​ ​2​,​ disponivel​:​ ​true​ ​}​,
​]
​}
​]
​}
​]
}​
​]
​}​])

Código 213
#.env, don't commit to repo
MONGO_CONNECTION=mongodb://localhost:27018
DATABASE_NAME=cinema-catalog-service
PORT=3001

Código 214
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
//index.test.js
require​(​"​dotenv-safe​"​).​config​()​;
require​(​"​./config/mongodb.test​"​).​runTests​()​;
require​(​"​./server/server.test​"​).​runTests​()​;

Código 215
{
​"​name​"​:​ ​"​cinema-catalog-service​"​,
​"​version​"​:​ ​"​1.0.0​"​,
​"​description​"​:​ ​"​Provide cinema catalog info.​"​,
​"​main​"​:​ ​"​index.js​"​,
​"​scripts​"​:​ ​{
​"​start​"​:​ ​"​node index​"​,
​"​test​"​:​ ​"​node index.test | tap-spec​"
​}​,
​"​author​"​:​ ​"​LuizTools​"​,
​"​license​"​:​ ​"​ISC​"​,
​"​dependencies​"​:​ ​{
​"​express​"​:​ ​"​^4.16.3​"​,
​"​helmet​"​:​ ​"​^3.12.0​"​,
​"​mongodb​"​:​ ​"​^3.1.0-beta4​"​,
​"​morgan​"​:​ ​"​^1.9.0​"​,
​"​supertest​"​:​ ​"​^3.0.0​"​,
​"​tape​"​:​ ​"​^4.9.0​"
}​
}

Código 216
//repository.js
const​ mongodb ​=​ require​(​"​../config/mongodb​"​)​;
const​ ObjectId ​=​ require​("​ ​mongodb​"​).​ObjectId​;

function​ getAllCities​(​callback​)​{
mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{
db​.​collection​(​"​cinemaCatalog​")​ .​find​(​{}​,​ ​{​cidade​:​1​,​uf​:​1​,​pais​:​1​}​).​toArray​(​callback​)​;
​}​)
}

function​ getCinemasByCityId​(​cityId​,​ callback​)​{


​var​ objCityId ​=​ ObjectId​(​cityId​);​
mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{
db​.​collection​(​"​cinemaCatalog​")​ .​find​(​{​_id​:​ objCityId​}​,​ ​{​cinemas​:​ ​1​}​).​toArray​((​err​,​ cities​)
=>​ ​{
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​if​(​err​)​ ​return​ callback​(​err​,​ ​null​);​
callback​(​err​,​ cities​[​0​].​cinemas​)​;
​}​)​;
​}​)​;
}

function​ disconnect​()​{
​return​ mongodb​.​disconnect​()​;
}

module​.​exports ​=​ ​{​ getAllCities​,​ getCinemasByCityId​,​ disconnect ​}

Código 217
const​ ​test​ ​=​ require​(​'​tape​'​)​;
const​ repository ​=​ require​(​'​./repository​')​ ​;

function​ runTests​()​{

​var​ cityId ​=​ ​null​;


​var​ cinemaId ​=​ ​null​;
​var​ movieId ​=​ ​null​;

​test​(​'​Repository getAllCities​'​,​ ​(​t​)​ ​=>​ {


repository​.​getAllCities​((​err​,​ cities​)​ ​=>​ {
​if​(​cities ​&&​ cities​.​length​ ​>​ ​0​)​ cityId ​=​ cities​[​1​].​_id;​//Porto Alegre

t​.​assert​(!​err ​&&​ cities ​&&​ cities​.​length​ ​>​ ​0​,​ ​"​All Cities Returned​"​)​;
t​.​end​()​;
}​)​;
}​)

​test​(​'​Repository getCinemasByCityId​'​,​ ​(​t​)​ ​=>​ {


repository​.​getCinemasByCityId​(​cityId​,​ ​(​err​,​ cinemas​)​ ​=>​ {
​if​(​cinemas ​&&​ cinemas​.​length​ ​>​ ​0​)​ cinemaId ​=​ cinemas​[​0​].​_id;

t​.​assert​(!​err ​&&​ cinemas ​&&​ cinemas​.​length​ ​>​ ​0​,​ ​"​All Cinemas Returned By City Id​"​)​;
t​.​end​()​;
}​)​;
}​)

​test​(​'​Repository Disconnect​'​,​ ​(​t​)​ ​=>​ {


t​.​assert​(​repository​.​disconnect​(),​ ​"D ​ isconnect Ok​"​)​;
t​.​end​()​;
}​)
}

module​.​exports ​=​ { runTests }


Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 218
//index.test.js
require​(​"​dotenv-safe​"​).c​onfig​()​;
require​(​"​./config/mongodb.test​"​).​runTests​()​;
require​(​"​./server/server.test​"​).​runTests​()​;
require​(​"​./repository/repository.test​"​).​runTests​()​;

Código 219
function​ getMoviesByCinemaId​(​cinemaId​,​ callback​)​{
​var​ objCinemaId ​=​ ObjectId​(c​ inemaId​)​;
mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{
db​.​collection​(​"​cinemaCatalog​")​ .​aggregate​([
​{​$​match​:​ ​{​"​cinemas._id​"​:​ objCinemaId​}}​,
​{​$unwind​:​ ​"​$cinemas​"}​ ​,
​{​$unwind​:​ ​"​$cinemas.salas​"​}​,
​{​$unwind​:​ ​"​$cinemas.salas.sessoes​"​}​,
​{​$group​:​ ​{​_id​:​ ​{​ filme​:​ ​"​$cinemas.salas.sessoes.filme​"​,​ idFilme​:
"​$cinemas.salas.sessoes.idFilme​"​}}}
​]).​toArray​(​callback​)​;
​}​)​;
}

Código 220
function​ getMoviesByCityId​(​cityId​,​ callback​)​{
​var​ objCityId ​=​ ObjectId​(​cityId​);​
mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{
db​.​collection​(​"​cinemaCatalog​")​ .​aggregate​([
​{​$​match​:​ ​{​"​_id​"​:​ objCityId​}}​,
​{​$unwind​:​ ​"​$cinemas​"}​ ​,
​{​$unwind​:​ ​"​$cinemas.salas​"​}​,
​{​$unwind​:​ ​"​$cinemas.salas.sessoes​"​}​,
​{​$group​:​ ​{​_id​:​ ​{​ filme​:​ ​"​$cinemas.salas.sessoes.filme​"​,​ idFilme​:
"​$cinemas.salas.sessoes.idFilme​"​}}}
​]).​toArray​((​err​,​ sessions​)​ ​=>​ ​{
​if​(​err​)​ ​return​ callback​(​err​,​ ​null​);​
callback​(​err​,​ sessions​.​map​(i​ tem​ ​=>​ ​{​ ​return​ ​{​idFilme​:​ ​item​.​_id​.​idFilme​,​ filme​:
item​.​_id​.​filme ​}​ ​}​ ​))​;

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​}​)​;
​}​)​;
}

function​ getMovieSessionsByCityId​(​movieId​,​ cityId​,​ callback​)​{


​var​ objMovieId ​=​ ObjectId​(​movieId​)​;
​var​ objCityId ​=​ ObjectId​(​cityId​);​

mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{


db​.​collection​(​"​cinemaCatalog​")​ .​aggregate​([
​{​$​match​:​ ​{​"​_id​"​:​ objCityId​}}​,
​{​$unwind​:​ ​"​$cinemas​"}​ ​,
​{​$unwind​:​ ​"​$cinemas.salas​"​}​,
​{​$unwind​:​ ​"​$cinemas.salas.sessoes​"​}​,
​{​$​match​:​ ​{​"​cinemas.salas.sessoes.idFilme​"​:​ objMovieId​}}​,
​{​$group​:​ ​{​_id​:​ ​{​ filme​:​ ​"​$cinemas.salas.sessoes.filme​"​,​ idFilme​:
"​$cinemas.salas.sessoes.idFilme​"​,​ idCinema​:​ ​"​$cinemas._id​"​,​ sala​:​ ​"​$cinemas.salas.nome​"​,
sessao​:​ ​"​$cinemas.salas.sessoes​"}​ }}
​]).​toArray​((​err​,​ sessions​)​ ​=>​ ​{
​if​(​err​)​ ​return​ callback​(​err​,​ ​null​);​
callback​(​err​,​ sessions​.​map​(i​ tem​ ​=>​ ​{​ ​return​ ​{​idFilme​:​ ​item​.​_id​.​idFilme​,​ filme​:
item​.​_id​.​filme​,​ idCinema​:​ ​item​.​_id​.​idCinema​,​ sala​:​ ​item​.​_id​.​sala​,​ sessao​:​ ​item​.​_id​.​sessao ​}​ ​}
))​;
​}​)​;
​}​)​;
}

function​ getMovieSessionsByCinemaId​(​movieId​,​ cinemaId​,​ callback​)​{


​var​ objCinemaId ​=​ ObjectId​(c​ inemaId​)​;
​var​ objMovieId ​=​ ObjectId​(​movieId​)​;
mongodb​.​connect​((​err​,​ db​)​ ​=>​ ​{
db​.​collection​(​"​cinemaCatalog​")​ .​aggregate​([
​{​$​match​:​ ​{​"​cinemas._id​"​:​ objCinemaId​}}​,
​{​$unwind​:​ ​"​$cinemas​"}​ ​,
​{​$unwind​:​ ​"​$cinemas.salas​"​}​,
​{​$unwind​:​ ​"​$cinemas.salas.sessoes​"​}​,
​{​$​match​:​ ​{​"​cinemas.salas.sessoes.idFilme​"​:​ objMovieId​}}​,
​{​$group​:​ ​{​_id​:​ ​{​ filme​:​ ​"​$cinemas.salas.sessoes.filme​"​,​ idFilme​:
"​$cinemas.salas.sessoes.idFilme​"​,​ sala​:​ ​"​$cinemas.salas.nome​"​,​ sessao​:
"​$cinemas.salas.sessoes​"​}}}
​]).​toArray​((​err​,​ sessions​)​ ​=>​ ​{
​if​(​err​)​ ​return​ callback​(​err​,​ ​null​);​
callback​(​err​,​ sessions​.​map​(i​ tem​ ​=>​ ​{​ ​return​ ​{​idFilme​:​ ​item​.​_id​.​idFilme​,​ filme​:
item​.​_id​.​filme​,​ sala​:​ ​item​.​_id​.​sala​,​ sessao​:​ ​item​.​_id​.​sessao ​}​ ​}​ ​))​;
​}​)​;
​}​)​;
}

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 221
module.exports = { getAllCities, getCinemasByCityId, getMoviesByCityId,
getMoviesByCinemaId, getMovieSessionsByCityId, getMovieSessionsByCinemaId,
disconnect }

Código 222
test​(​'​Repository getMoviesByCinemaId​'​,​ ​(​t​)​ ​=>​ ​{
repository​.​getMoviesByCinemaId​(​cinemaId​,​ ​(​err​,​ movies​)​ ​=>​ ​{
t​.​assert​(!​err ​&&​ movies ​&&​ movies​.​length​ ​>​ ​0​,​ ​"​Movies By Cinema Id Returned​"​)​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​Repository getMoviesByCityId​'​,​ ​(​t​)​ ​=>​ ​{


repository​.​getMoviesByCityId​(​cityId​,​ ​(​err​,​ movies​)​ ​=>​ ​{
​if​(​movies ​&&​ movies​.​length​ ​>​ ​0)​ ​ movieId ​=​ movies​[​1​].​idFilme​;​//Era de Ultron
t​.​assert​(!​err ​&&​ movies ​&&​ movies​.​length​ ​>​ ​0​,​ ​"​Movies By City Id Returned​"​)​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​Repository getMovieSessionsByCityId​'​,​ ​(​t​)​ ​=>​ ​{


repository​.​getMovieSessionsByCityId​(​movieId​,​ cityId​,​ ​(​err​,​ sessions​)​ ​=>​ ​{
t​.​assert​(!​err ​&&​ sessions ​&&​ sessions​.​length​ ​>​ ​0​,​ ​"​Movie Sessions By City Id
Returned​"​)​;
t​.​end​()​;
​}​)​;
​}​)

​test​(​'​Repository getMovieSessionsByCinemaId​'​,​ ​(​t​)​ ​=>​ ​{


repository​.​getMovieSessionsByCinemaId​(​movieId​,​ cinemaId​,​ ​(​err​,​ sessions​)​ ​=>​ ​{
t​.​assert​(!​err ​&&​ sessions ​&&​ sessions​.​length​ ​>​ ​0​,​ ​"​Movie Sessions By Cinema Id
Returned​"​)​;
t​.​end​()​;
​}​)​;
​}​)

Código 223

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
//cinema-catalog.js
module​.​exports ​=​ ​(​app​,​ repository​)​ ​=>​ ​{

app​.​get​(​'​/cities​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getAllCities​((​err​,​ cities​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​)​;
res​.​json​(​cities​)​;
​}​)​;
​}​)

app​.​get​(​'​/cities/:city/movies​',​ ​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getMoviesByCityId​(​req​.​params​.​city​,​ ​(​err​,​ movies​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​);​
res​.​json​(​movies​)
​}​)​;
​}​)

app​.​get​(​'​/cities/:city/movies/:movie​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getMovieSessionsByCityId​(​req​.​params​.​movie​,​ req​.​params​.​city​,​ ​(​err​,
sessions​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​)​;
res​.​json​(​sessions​)
​}​)​;
​}​)

app​.​get​(​'​/cities/:city/cinemas​'​,​ ​(r​ eq​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getCinemasByCityId​(​req​.​params​.​city​,​ ​(​err​,​ cinemas​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​)​;
res​.​json​(​cinemas​)
​}​)​;
​}​)

app​.​get​(​'​/cinemas/:cinema/movies​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getMoviesByCinemaId​(​req​.​params​.​cinema​,​ ​(​err​,​ movies​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​)​;
res​.​json​(​movies​)
​}​)​;
​}​)

app​.​get​(​'​/cinemas/:cinema/movies/:movie​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


repository​.​getMovieSessionsByCinemaId​(​req​.​params​.​movie​,​ req​.​params​.​cinema​,​ ​(​err​,
sessions​)​ ​=>​ ​{
​if​(​err​)​ ​return​ next​(​err​)​;
res​.​json​(​sessions​)
​}​)​;
​}​)
​}

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 224
//cinema-catalog.test.js
const​ ​test​ ​=​ require​(​'​tape​'​)​;
const​ supertest ​=​ require​(​'​supertest​'​)​;
const​ movies ​=​ require​(​'​./cinema-catalog​'​)​;
const​ server ​=​ require​(​"​../server/server​")​ ​;
const​ repository ​=​ require​(​"​../repository/repository​"​)​;

function​ runTests​()​{

​var​ app ​=​ ​null​;


server​.​start​(​movies​,​ repository​,​ ​(e
​ rr​,​ app​)​ ​=>​ ​{
​var​ cityId ​=​ ​null​;
​var​ movieId ​=​ ​null​;
​var​ cinemaId ​=​ ​null​;

​test​(​'​GET /cities​'​,​ ​(​t​)​ ​=>​ ​{


supertest​(​app​)
​.​get​(​'​/cities​'​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
​if​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​)​ cityId ​=​ res​.​body​[​1​].​_id​;
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​,​ ​"​All Cities returned​"​)
t​.​end​()
​}​)
​}​)

​test​(​'​GET /cities/:city/movies​',​ ​ ​(​t​)​ ​=>​ ​{


supertest​(​app​)
​.​get​(​'​/cities/​'​ ​+​ cityId ​+​ ​"​/movies​"​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
​if​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​)​ movieId ​=​ res​.​body​[​0​].​idFilme​;
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body​,​ ​"​Movies By City Id returned​"​)
t​.​end​()
​}​)
​}​)

​test​(​'​GET /cities/:city/movies/:movie​'​,​ ​(​t​)​ ​=>​ ​{


supertest​(​app​)
​.​get​(​'​/cities/​'​ ​+​ cityId ​+​ ​'​/movies/​'​ ​+​ movieId​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
​if​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​)​ cinemaId ​=​ res​.​body​[​0​].​idCinema​;
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body ​&&​ res​.​body​.​length​ ​>​ ​0​,​ ​"​Movie Sessions by City Id returned​"​)
t​.​end​()
​}​)
​}​)

​test​(​'​GET /cities/:city/cinemas​'​,​ ​(t​ ​)​ ​=>​ ​{


supertest​(​app​)
​.​get​(​'​/cities/​'​ ​+​ cityId ​+​ ​'​/cinemas​'​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body​,​ ​"​Cinemas By City Id returned​"​)
t​.​end​()
​}​)
​}​)

​test​(​'​GET /cinemas/:cinema/movies​'​,​ ​(​t​)​ ​=>​ ​{


supertest​(​app​)
​.​get​(​'​/cinemas/​'​ ​+​ cinemaId ​+​ ​"​/movies​"​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body​,​ ​"​Movies By Cinema Id returned​"​)
t​.​end​()
​}​)
​}​)

​test​(​'​GET /cinemas/:cinema/movies/:movie​'​,​ ​(​t​)​ ​=>​ ​{


supertest​(​app​)
​.​get​(​'​/cinemas/​'​ ​+​ cinemaId ​+​ ​"​/movies/​"​ ​+​ movieId​)
​.​expect​(​'​Content-Type​'​,​ ​/​json​/​)
​.​expect​(​200​)
​.​end​((​err​,​ res​)​ ​=>​{
t​.​error​(​err​,​ ​'​No errors​')​
t​.​assert​(​res​.​body​,​ ​"​Movie Sessions By Cinema Id returned​"​)
t​.​end​()
​}​)
​}​)

repository​.​disconnect​()​;
server​.​stop​()​;
​}​)
}

module​.​exports ​=​ ​{​ runTests ​}

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Código 225
//index.test.js
require​(​"​dotenv-safe​"​).​config​()​;
require​(​"​./config/mongodb.test​"​).​runTests​()​;
require​(​"​./server/server.test​"​).​runTests​()​;
require​(​"​./repository/repository.test​"​).​runTests​()​;
require​(​"​./api/cinema-catalog.test​"​).​runTests​()​;

Código 226
//index.js
require​(​"​dotenv-safe​"​).​config​()​;
const​ cinemaCatalog ​=​ require​(​'.​ /api/cinema-catalog​'​)​;
const​ server ​=​ require​(​"​./server/server​"​)​;
const​ repository ​=​ require​(​"​./repository/repository​"​)​;

server​.​start​(​cinemaCatalog​,​ repository​,​ ​(​err​,​ app​)​ ​=>​ ​{


console​.​log​(​"​just started​"​)​;
}​)​;

Código 227
npm install http express morgan helmet express-http-proxy cookie-parser

Código 228
//index.js
var​ http ​=​ require​(​'​http​'​)​;
const​ express ​=​ require​(​'​express​')​
const​ httpProxy ​=​ require​('​ ​express-http-proxy​'​)
const​ app ​=​ express​()
var​ cookieParser ​=​ require​(​'c​ ookie-parser​'​)​;
var​ logger ​=​ require​(​'​morgan​')​ ​;
const​ helmet ​=​ require​(​'​helmet​')​ ​;

const​ userServiceProxy ​=​ httpProxy​(​'​http://localhost:3001​'​)​;

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
const​ productsServiceProxy ​=​ httpProxy​(​'​http://localhost:3002​'​)​;

// Proxy request
app​.​get​(​'​/users​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{
userServiceProxy​(​req​,​ res​,​ next​)​;
}​)

app​.​get​(​'​/products​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


productsServiceProxy​(​req​,​ res​,​ next​);​
}​)

app​.​use​(​logger​(​'​dev​'​))​;
app​.​use​(​helmet​())​;
app​.​use​(​express​.​json​())​;
app​.​use​(​express​.​urlencoded​(​{​ extended​:​ ​false​ ​}​))​;
app​.​use​(​cookieParser​())​;

var​ server ​=​ http​.​createServer​(​app​)​;


server​.​listen​(​3000​)​;

Código 229
//index.js
var​ http ​=​ require​(​'​http​'​)​;
const​ express ​=​ require​(​'​express​')​
const​ httpProxy ​=​ require​('​ ​express-http-proxy​'​)
const​ app ​=​ express​()
var​ cookieParser ​=​ require​(​'c​ ookie-parser​'​)​;
var​ logger ​=​ require​(​'​morgan​')​ ​;
const​ helmet ​=​ require​(​'​helmet​')​ ​;

const​ userServiceProxy ​=​ httpProxy​(​'​http://localhost:3001​'​)​;


const​ productsServiceProxy ​=​ httpProxy​(​'​http://localhost:3002​'​)​;

// Proxy request
app​.​get​(​'​/users​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{
userServiceProxy​(​req​,​ res​,​ next​)​;
}​)

app​.​get​(​'​/products​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


productsServiceProxy​(​req​,​ res​,​ next​);​
}​)

app​.​use​(​logger​(​'​dev​'​))​;
app​.​use​(​helmet​())​;

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
app​.​use​(​express​.​json​())​;
app​.​use​(​express​.​urlencoded​(​{​ extended​:​ ​false​ ​}​))​;
app​.​use​(​cookieParser​())​;

var​ server ​=​ http​.​createServer​(​app​)​;


server​.​listen​(​3000​)​;

Código 230
npm install jsonwebtoken dotenv-safe

Código 231
# .env.example, commit to repo
SECRET=

Código 232
#.env, don't commit to repo
SECRET=mysecret

Código 233
require​(​"​dotenv-safe​"​).​config​()​;
var​ jwt ​=​ require​(​'​jsonwebtoken​'​)​;

Código 234
//authentication
app​.​post​(​'​/login​'​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{
​if​(​req​.​body​.​user ​===​ ​'​luiz​'​ ​&&​ req​.​body​.​pwd ​===​ ​'​123​'​)​{
​//auth ok
​const​ id ​=​ ​1​;​ ​//esse id viria do banco de dados
​var​ token ​=​ jwt​.​sign​(​{​ id ​}​,​ process​.​env​.​SECRET​,​ ​{
expiresIn​:​ ​300​ ​// expires in 5min
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
}​ ​)​;
res​.​status​(​200​).​send​(​{​ auth​:​ ​true​,​ token​:​ token ​}​)​;
​}

res​.​status​(​500​).​send​(​'​Login inválido!​'​)​;
}​)

Código 235
app​.​get​(​'​/logout​'​,​ ​function​(​req​,​ res​)​ ​{
res​.​status​(​200​).​send​(​{​ auth​:​ ​false​,​ token​:​ ​null​ ​}​)​;
}​)​;

Código 236
function​ verifyJWT​(​req​,​ res​,​ next​)​{
​var​ token ​=​ req​.​headers​[​'​x-access-token​'​]​;
​if​ ​(!​token​)​ ​return​ res​.​status​(​401​).​send​(​{​ auth​:​ ​false​,​ message​:​ ​'​No token provided.​'​ ​}​)​;

jwt​.​verify​(​token​,​ process​.​env​.​SECRET​,​ ​function​(​err​,​ decoded​)​ ​{


​if​ ​(​err​)​ ​return​ res​.​status​(​500​).​send​({​ ​ auth​:​ ​false​,​ message​:​ ​'​Failed to authenticate token.​'
}​)​;

​// se tudo estiver ok, salva no request para uso posterior


req​.​userId ​=​ decoded​.​id​;
next​()​;
​}​)​;
}

Código 237
// Proxy request
app​.​get​(​'​/users​'​,​ verifyJWT​,​ ​(r​ eq​,​ res​,​ next​)​ ​=>​ ​{
userServiceProxy​(​req​,​ res​,​ next​)​;
}​)

app​.​get​(​'​/products​'​,​ verifyJWT​,​ ​(​req​,​ res​,​ next​)​ ​=>​ ​{


productsServiceProxy​(​req​,​ res​,​ next​);​
}​)

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs
Curtiu o livro?
Por favor, deixe a sua review sincera sobre o livro acessando o link abaixo, isso ajuda muito
este humilde autor:
https://www.amazon.com.br/review/create-review/ref=cm_cr_dp_d_wr_but_top?ie=UTF8&ch
annel=glance-detail&asin=B075WQSDZ8

Aproveita e me segue nas redes sociais:

Facebook.com/luiztools
Twitter.com/luiztools
LinkedIn.com/in/luizfduartejr

Conheça meus outros trabalhos:

Criando apps para empresas com Android


Scrum e Métodos Ágeis: Um Guia Prático
Programação Web com Node.js
Node.js e Microservices
Java para Iniciantes

Conheça meus cursos:

Curso online de Scrum e Métodos Ágeis


Curso online de Node.js e MongoDB

Quer fazer um curso online de Node.js e MongoDB com o autor deste livro? Acesse http://www.luiztools.com.br/curso-nodejs

También podría gustarte