Skip to content

Commit aa4b2b1

Browse files
committed
part 4d
1 parent ec35ed9 commit aa4b2b1

File tree

3 files changed

+346
-12
lines changed

3 files changed

+346
-12
lines changed

src/content/4/en/part4d.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ The operation must respond with a suitable status code and some kind of an error
393393

394394
Also, **implement tests** that ensure invalid users are not created and that an invalid add user operation returns a suitable status code and error message.
395395

396-
**NB** if you decide to define tests on multiple files, you should note that by default each test file is executed in its own process (see _Test execution model_ in the [documentation](https://nodejs.org/api/test.html)). The consequence of this is that different test files are executed at the same time. Since the tests share the same database, simultaneous execution may cause problems. Problems are avoided by executing the tests with the option _--test-concurrency=1_, i.e. defining them to be executed sequentially.
396+
**NB** if you decide to define tests on multiple files, you should note that by default each test file is executed in its own process (see _Test execution model_ in the [documentation](https://nodejs.org/api/test.html#test-runner-execution-model)). The consequence of this is that different test files are executed at the same time. Since the tests share the same database, simultaneous execution may cause problems, which can be avoided by executing the tests with the option _--test-concurrency=1_, i.e. defining them to be executed sequentially.
397397

398398
#### 4.17: Blog List Expansion, step 5
399399

@@ -520,7 +520,7 @@ app.use('/api/users', usersRouter)
520520
app.use('/api/login', loginRouter)
521521
```
522522

523-
As can be seen, this happens by chaining multiple middlewares as the parameter of function <i>use</i>. It would also be possible to register a middleware only for a specific operation:
523+
As can be seen, this happens by chaining multiple middlewares as the arguments of the function <i>use</i>. It would also be possible to register a middleware only for a specific operation:
524524

525525
```js
526526
const middleware = require('../utils/middleware');

src/content/4/es/part4d.md

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,14 @@ Si el token es invalido o está ausente, la excepción <i>JsonWebTokenError</i>
220220

221221
```js
222222
const errorHandler = (error, request, response, next) => {
223-
logger.error(error.message)
224-
225223
if (error.name === 'CastError') {
226224
return response.status(400).send({ error: 'malformatted id' })
227225
} else if (error.name === 'ValidationError') {
228226
return response.status(400).json({ error: error.message })
227+
} else if (error.name === 'MongoServerError' && error.message.includes('E11000 duplicate key error')) {
228+
return response.status(400).json({ error: 'expected `username` to be unique' })
229229
} else if (error.name === 'JsonWebTokenError') { // highlight-line
230-
return response.status(401).json({ error: error.message }) // highlight-line
230+
return response.status(401).json({ error: 'token invalid' }) // highlight-line
231231
}
232232

233233
next(error)
@@ -252,13 +252,13 @@ Ahora se puede crear una nueva nota usando Postman si el encabezado <i>authoriza
252252

253253
Usando Postman, esto se ve de la siguiente manera:
254254

255-
![postman agregando bearer token](../../images/4/20e.png)
255+
![postman agregando bearer token](../../images/4/20new.png)
256256

257257
y con el cliente REST de Visual Studio Code
258258

259-
![vscode rest agregando bearer token](../../images/4/21e.png)
259+
![vscode rest agregando bearer token](../../images/4/21new.png)
260260

261-
El código de la aplicación actual se puede encontrar en [Github](https://github.com/fullstack-hy2020/part3-notes-backend/tree/part4-9), rama <i>part4-9</i>.
261+
El código de la aplicación actual se puede encontrar en [GitHub](https://github.com/fullstack-hy2020/part3-notes-backend/tree/part4-9), rama <i>part4-9</i>.
262262

263263
Si la aplicación tiene múltiples interfaces que requieren identificación, la validación de JWT debe separarse en su propio middleware. También se podría utilizar alguna librería existente como [express-jwt](https://www.npmjs.com/package/express-jwt).
264264

@@ -315,6 +315,10 @@ const errorHandler = (error, request, response, next) => {
315315
return response.status(400).send({ error: 'malformatted id' })
316316
} else if (error.name === 'ValidationError') {
317317
return response.status(400).json({ error: error.message })
318+
} else if (error.name === 'MongoServerError' && error.message.includes('E11000 duplicate key error')) {
319+
return response.status(400).json({
320+
error: 'expected `username` to be unique'
321+
})
318322
} else if (error.name === 'JsonWebTokenError') {
319323
return response.status(401).json({
320324
error: 'invalid token'
@@ -335,7 +339,7 @@ Cuanto más corto sea el tiempo de caducidad, más segura será la solución. Po
335339

336340
La otra solución es guardar información sobre cada token en la base de datos y verificar en cada solicitud de API si el derecho de acceso correspondiente al token sigue siendo válido. Con este esquema, los derechos de acceso pueden ser revocados en cualquier momento. Este tipo de solución a menudo se denomina <i>server-side session</i>.
337341

338-
El aspecto negativo de las sesiones del lado del servidor es la mayor complejidad en el backend y también el efecto en el rendimiento, ya que se debe verificar la validez del token para cada solicitud de API a la base de datos. El acceso a la base de datos es considerablemente más lento en comparación con la verificación de la validez del token en sí. Es por eso que es bastante común guardar la sesión correspondiente a un token en una <i>base de datos de llave-valor</i> como [Redis](https://redis.io/) que tiene una funcionalidad limitada en comparación con MongoDB o bases de datos relacionales, pero es extremadamente rápida en algunos escenarios de uso.
342+
El aspecto negativo de las sesiones del lado del servidor es la mayor complejidad en el backend y también el efecto en el rendimiento, ya que se debe verificar la validez del token para cada solicitud de API a la base de datos. El acceso a la base de datos es considerablemente más lento en comparación con la verificación de la validez del token en sí. Es por eso que es bastante común guardar la sesión correspondiente a un token en una <i>base de datos de llave-valor</i> como [Redis](https://redis.io/), que tiene una funcionalidad limitada en comparación con MongoDB o una base de datos relacional, pero es extremadamente rápida en algunos escenarios de uso.
339343

340344
Cuando se utilizan sesiones del lado del servidor, el token suele ser solo una cadena aleatoria, que no incluye ninguna información sobre el usuario, como suele ser el caso cuando se utilizan jwt-tokens. Para cada solicitud de API, el servidor obtiene la información relevante sobre la identidad del usuario de la base de datos. También es bastante habitual que, en lugar de utilizar el encabezado de autorización, se utilicen <i>cookies</i> como mecanismo para transferir el token entre el cliente y el servidor.
341345

@@ -387,7 +391,9 @@ La operación debe responder con un código de estado adecuado y algún tipo de
387391

388392
**NB** No pruebes las restricciones de password con las validaciones de Mongoose. No es una buena idea porque la password recibida por el backend y el hash de password guardado en la base de datos no son lo mismo. La longitud de la contraseña debe validarse en el controlador como hicimos en la [parte 3](/es/part3/validacion_y_es_lint) antes de usar la validación de Mongoose.
389393

390-
Además, implementa pruebas que verifiquen que no se creen usuarios no válidos y que una operación de agregar usuario que sea no válida devuelva un código de estado adecuado y un mensaje de error.
394+
Además, **implementa pruebas** que verifiquen que no se creen usuarios no válidos y que una operación de agregar usuario que sea no válida devuelva un código de estado adecuado y un mensaje de error.
395+
396+
**NB** si decides definir pruebas en múltiples archivos, debes notar que por defecto cada archivo de prueba se ejecuta en su propio proceso (ver _Modelo de ejecución de pruebas_ en la [documentación](https://nodejs.org/api/test.html#test-runner-execution-model)). La consecuencia de esto es que diferentes archivos de prueba se ejecutan al mismo tiempo. Dado que las pruebas comparten la misma base de datos, la ejecución simultánea puede causar problemas, que pueden evitarse ejecutando las pruebas con la opción _--test-concurrency=1_, es decir, definiéndolas para que se ejecuten secuencialmente.
391397

392398
#### 4.17: Expansión de la Lista de Blogs, paso 5
393399

@@ -416,7 +422,7 @@ Modifica la adición de nuevos blogs para que solo sea posible si se envía un t
416422

417423
[Este ejemplo](/es/part4/autenticacion_basada_en_token#limitacion-de-la-creacion-de-nuevas-notas-a-los-usuarios-registrados) de la parte 4 muestra cómo tomar el token del encabezado con la función auxiliar _getTokenFrom_.
418424

419-
Si usaste la misma solución, refactoriza para llevar el token a un [middleware](/es/part3/node_js_y_express#middleware). El middleware debe tomar el token del encabezado <i>Authorization</i> y debe colocarlo en el campo <i>token</i> del objeto <i>request</i>.
425+
Si usaste la misma solución, refactoriza para llevar el token a un [middleware](/es/part3/node_js_y_express#middleware). El middleware debe tomar el token del encabezado <i>Authorization</i> y debe asignarlo al campo <i>token</i> del objeto <i>request</i>.
420426

421427
En otras palabras, si registras este middleware en el archivo <i>app.js</i> antes de todas las rutas
422428

@@ -514,7 +520,7 @@ app.use('/api/users', usersRouter)
514520
app.use('/api/login', loginRouter)
515521
```
516522

517-
Como puede verse, esto sucede al encadenarse múltiples middlewares como parámetro de la función <i>use</i>. También sería posible registrar un middleware solo para una operación específica:
523+
Como puede verse, esto sucede al encadenarse múltiples middlewares como argumentos de la función <i>use</i>. También sería posible registrar un middleware solo para una operación específica:
518524

519525
```js
520526
const middleware = require('../utils/middleware');

0 commit comments

Comments
 (0)