Platzi
Platzi

LA EDUCACI脫N ES UN REGALO 隆ACCEDE AL PRECIO ESPECIAL!

Antes: $249
$149
Currency
Antes: $249
Ahorras: $100
COMIENZA AHORA
Termina en: 16D : 15H : 59M : 21S

Estructura inicial del proyecto: API y rutas

3/29
Recursos
Transcripci贸n

Aportes 29

Preguntas 5

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Recordemos que se permite, me parece que desde ES8 poner valores dummy desde la inicializaci贸n de las funciones:

exports.error = (req, res, message = 'Internal Server Error', status = 500) => {
  res.status(status).send({
    error: true,
    status,
    body: message
  })
}

Mi soluci贸n al archivo 鈥渞esponse.js鈥:

const httpStatus = require("http-status-codes");

exports.success = (req, res, message = "", status = httpStatus.OK) => {
  res.status(status).send({
    error: false,
    status: status,
    body: message
  });
};

exports.error = (req, res, message = "Internal server error", status = httpStatus.INTERNAL_SERVER_ERROR) => {
  res.status(status).send({
    error: true,
    status: status,
    body: message
  });
};

Utilizo una librer铆a para los c贸digos HTTP: https://www.npmjs.com/package/http-status-codes
.
Adem谩s que utilizo el valor por defecto del par谩metro en la declaraci贸n de la funci贸n para no crear las variables statusCode ni statusMessage

Hay un error en response.js, falta asignar el statusMessage y statusCode, al status y al body.

De esta manera:

exports.success = function (req, res, message, status){

  let statusCode = status || 200; 
  let statusMessage = message || '';

  res.status(status).send({
    error: false,
    status: statusCode,
    body: statusMessage
  });
}

exports.error = function (req, res, message, status){
  
  let statusCode = status || 500;
  let statusMessage = message || 'Internal server error';

  res.status(status).send({
    error: false,
    status:statusCode,
    body: statusMessage
  });
}

Buen dia companeros, al ejecutar nodemon me sale este error:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Cabe senalar que en el browser me visualiza la respuesta de 鈥渘etwork.js鈥 en el :

router.get("/", function (req, res) {
  res.send("Everything works fine!");
  response.success(req, res, "All its good", 200);
});

Para los que nodemon no les ha funcionado, pueden instalarlo como una dependencia de desarrollo con un:

npm i --save-dev nodemon

Y despu茅s en el archivo package.json en la parte de scripts agregar la instrucci贸n

"dev": "nodemon ./api/index.js"

De esa forma con un npm run dev, pueden usar nodemon sin problema

Mi response.js 馃槃

const statusMessage = {
    "200": "OK",
    "201": "Creado",
    "301": "Movido permanentemente",
    "304": "No modificado",
    "400": "Error en la consulta",
    "401": "Sin autorizacion",
    "403": "Prohibido",
    "404": "No encontrado",
    "500": "Error del servidor"
}

function success(req, res, statusCode=200, result=null) {
    res.status(statusCode).send({
        status: statusMessage[statusCode],
        body: result
    })
}

function error(req, res, statusCode=500, details=null) {
    if (details !== null){
        console.error(`Error Details: ${details}`)
    }

    res.status(statusCode).send({
        status: statusMessage[statusCode]
    })
}

module.exports = {
    success,
    error
}

Para los que no les funciona deben instalar nodemon con
npm install -g nodemon

o ejecutar el comando con node nodemon api/index.js

Les comparto un peque帽o m贸dulo que permite tener impresiones por consola de forma uniforme.

Requiere tener instalado chalk que se puede hacer con el comando

yarn add chalk --dev

El c贸digo es el siguiente:

const chalk = require('chalk');

const printSuccess = (moduleName, message) => {
  console.log(chalk.bold.green(`[${moduleName.toUpperCase()}]`), `${chalk.blue(message)}`);
}

const printError = (moduleName, message) => {
  console.log(chalk.bold.red(`[${moduleName.toUpperCase()}]`), `${chalk.yellow(message)}`);
}

module.exports = {
  printError,
  printSuccess,
}

Hola espero ayudar

// llamado
    response(req, res, { success: 'Todo correcto' }, { success: 200 });

// funcion
function response(req, res, message, status) {
    let statusError,statusCode,statusMessage;
    console.log(message);

    if (status.success) {
        statusError = null;
        statusCode = status.success || 200;
        statusMessage = message.success || 'Success Operation';
    }else{
        statusError = message.error || 'Internal Server Error';
        statusCode = status.error || 500;
        statusMessage = null;
    }

    res.status(statusCode).send({
        error: statusError,
        status: statusCode,
        body: statusMessage

    });
}

No permitira tener un c贸digo mas limpio y ordenado

Creando la estructura principal

Estructura inicial del proyecto: API y rutas

Debemos tener instalado express en nuestro proyecto.

npm init -y & npm i express

Tambi茅n debemos tener nodemon isntalado: npm i -g nodemon

Creamos la carepta 鈥楢PI鈥 y es para extraer los microservicios.

Archivo index.js:

//* Creamos el servidor en este archivo

const express = require('express')

const config = require('../config')
const user = require('./components/user/network')

const app = express()
const port = config.api.port

//* ROUTER
app.get('/', (req, res) => res.send('Hello World!'))
app.use('/api/user', user)

app.listen(port, () => console.log(`API escuchando en el puerto ${port}`))

Dentro de 鈥楢PI鈥 haremos una carpeta 鈥榗omponents鈥 y 鈥榰ser鈥, y tendremos un archivo network.js:

const express = require('express')

const response = require('../../../network/response')

const router = express.Router()

router.get('/', (req, res) => {
  response.success(req, res, 'Todo funciona', 200)
})

module.exports = router

Y en la ra铆z del proyecto tendremos una carpeta 鈥榥etwork鈥 y un archivo response.js:

//*Todas las respuestas en el mismo archivo

exports.success = function(req, res, message, status){
  let statusCode = status || 200;
  let statusMessage = message || '';

  res.status(status).send({
    error: false,
    status: status,
    body: message
  })
}

exports.error = function(req, res, message, status){
  let statusCode = status || 500;
  let statusMessage = message || 'Internal Server Error';

  res.status(statusCode).send({
    error: false,
    status: status,
    body: message
  })
}

Con todo esto, si hacemos nodemon api/index.js en el navegador podremos ir a la ruta https://localhost:3000/api/user

Y tendremos como respuesta un json:

{
  "error": false,
  "status": 200,
  "body": "Todo funciona"
}

Mi soluci贸n:

index.js

const app = express();

const config = require('./config.js');
const user = require('./api/components/user/network')
// router
app.use('/api/user', user);

app.listen(config.api.port, () => {
    console.log('Api escuchando en el puerto: ', config.api.port)
})

response.js

exports.success = function (req, res, message, status) {
    let statusCode = status || 200;
    let statusMessage = message || '';

    res.status(status).send({
        error: false,
        status: statusCode,
        body: statusMessage,
    });
}

exports.error = function (req, res, message, status) {
    let statusCode = status || 500;
    let statusMessage = message || 'Internal server error';

    res.status(status).send({
        error: true,
        status: statusCode,
        body: statusMessage,
    });
}

network.js

const express = require('express');
const router = express.Router();
const response = require('../../../network/response');

router.get('/', (req, res) => {
    response.success(req, res, 'Todo perfecto campe贸n', 200);
})

module.exports = router;

config.js

module.exports = {
    api: {
        port: process.env.API_PORT || 3000,
    }
}

Podemos tambien hacer en el index algo como esto:

//  Initial configuration
app.set('port', process.env.PORT || 3000);


//  Starting the server
app.listen(app.get('port'), () => {
    console.log(`Server on port ${app.get('port')}, http://localhost:${app.get('port')}`);
})

Mi unica duda en esta clase es con el statusMessage. Osea, lo creamos pero en ningun momento se utiliza.-.

no me funciona el nodemon, me dice que: El t茅rmino 鈥榥odemon鈥 no se reconoce como nombre de un cmdlet, funci贸n, archivo de script o programa ejecutable. he intentado de todo y no me funciona鈥 ayuda!

Chicos por los momentos para que su ruta sea dinamica pueden hacerlo asi:

// SERVER LISTENING
app.listen(config.api.port, () => {
    console.log(`Api listening on port http://localhost:${config.api.port}/api/user`);
});```
y en el package.json agreguen en el script 


"start": "nodemon api/index.js"```

buenas es que cuando recargo en google no me aparece los datos de la lista

Iniciar con una buena estructura facilita la comprensi贸n del c贸digo.

exports.success = (req, res, message, status) => {
    let statusCode = status || 200;
    let statusMessage = message || '';

    res.status(statusCode).send({
        error: false,
        status: statusMessage,
        body: message,
    })
}
router.get('/', (req, res) => {
    response.success(req, res, 'Todo correcto', 200);
})

Genial

Podria seguir este curso usando Mongodb?

隆Buen d铆a!

El curso esta muy bueno y como plus quise realizarlo con Typescript, les comparto mi repositorio en caso de que quieran darle un vistazo.

Adem谩s de lo indicado en las 2 primeras sesiones, agregue eslint, dotenv(para manejar variables de entorno) y ts-node-dev como monitor de scripts en desarrollo.

gus-github

Saludos

Mi soluci贸n con **TypeScript **para el que la pueda ayudar !!

import { Request, Response } from 'express';
import { StatusCodes } from 'http-status-codes';

const success = (
	req: Request,
	res: Response,
	message = '',
	status = StatusCodes.OK
) => {
	const statusCode = status || 200;
	res.status(status).send({
		error: false,
		status,
		body: message,
	});
};

const error = (
	req: Request,
	res: Response,
	message = '',
	status = StatusCodes.INTERNAL_SERVER_ERROR
) => {
	res.status(status).send({
		error: false,
		status,
		body: message,
	});
};

export default { success, error };

Para este caso no ser铆a m谩s conveniente inyectar dependencias

Hice algo diferente en el punto del response para las respuestas del network para que sea mas facil de exportar y saque unos parametros ya que de momento no veo mucha necesidad de tenerla en las respuestas.

function Success(res, message, status = 200) {
    res.status(status).json({
        error: false,
        status,
        body: message
    })
}

function Error(res, message = "Internal server error", status = 500) {
    res.status(status).json({
        error: true,
        status,
        body: message
    })
}

module.exports = {
    Success,
    Error
}```

Para el tema de las respuestas desde el response lo hice de otra forma ya que me parece mas legible y facil de entender.

function Success(res, message, status = 200){
	res.status(status).json({
		error: false,
		status,
		body: message
	})
}

function Error(res, message = "Internal Server Error", status = 500){
	res.status(status).json({
		error: true,
		status,
		body: message
	})
}

module.exports = {
	Success,
	Error
}
exports.success = function(req, res, message, status) {
    let statusCode = status || 200;
    let statusMessage = message || '';

    res.status(statusCode).send({
        error: false,
        status: statusCode,
        body: statusMessage
    });
}

exports.error = function(req, res, message, status) {
    let statusCode = status || 500;
    let statusMessage = message || 'Internal server error';

    res.status(statusCode).send({
        error: false,
        status: statusCode,
        body: statusMessage
    });
}

Una pregunta. Vengo de Django.
En node es recomendado crear entornos virtuales para iniciar el proyecto?