Inicio del curso

1

¿Qué vamos a construir en el curso avanzado de Node.js?

Introducción a Node.js

2

Conoce qué es node.js

3

Características de la plataforma Node.js

4

¿Qué tipo de aplicaciones podemos desarrollar con Node.js?

Preparando el entorno de Desarrollo

5

Cómo instalar Node.js en macOS

6

Cómo instalar PostgreSQL y Redis en macOS

7

Cómo instalar Visual Studio Code en macOS

8

Cómo instalar Ansible en macOS

Arquitectura del Proyecto (Platziverse)

9

Arquitectura y Componentes del proyecto

Introducción a protocolos y patrones de aplicaciones en tiempo real

10

Cómo funciona el modelo Pub/Sub en MQTT y Web Sockets

Creando Módulo de Base de Datos (platziverse-db)

11

Estructura básica de un módulo de Node.js

12

Definición de entidades de base de datos

13

Implementación de modelos con sequelize

14

Implementación de un módulo básico de base de datos

15

Implementación de script de inicialización de base de datos

16

Creando una advertencia sobre el borrado de base de datos

17

Introducción a pruebas unitarias con Ava.js

18

Introducción a code coverage con nyc

19

Cómo hacer Mocks y Stubs con Sinon

20

Creación de fixtures y definición básica del servicio de Agent

21

Implementación de findbyId y pruebas en el servicio Agent

22

Implementación de createOrUpdate

23

Revisión del servicio Agent

24

Implementación del servicio Metric

25

Realizando un ejemplo con el módulo de base de datos

26

Reto: Cómo modificar el script de inicialización de la base de datos

Construyendo un servidor en tiempo real para Internet de las Cosas con Mosca/MQT

27

Definición de un Broker de Mensajería

28

Definición de los tipos de mensajes

29

Implementación del servidor MQTT

30

Cómo recibir mensajes

31

Cómo integrar el servidor MQTT con la base de datos

32

Cómo almacenar la información del agente y reportar el agente conectado

33

Cómo almacenar la información de las métricas

34

Probando el servidor MQTT (Ejemplo con mqtt client)

Construyendo el agente de monitoreo (platziverse-agent)

35

Cómo implementar un custom EventEmitter usando ES6 classes

36

Definiendo un timer de ejecución continua (setInterval)

37

Implementación del cliente MQTT

38

Implementación de métricas personalizadas

39

Probar agent (ejemplo)

Construyendo una API REST con Express (platziverse-api)

40

Implementación de un servidor básico con express

41

Definición de rutas del API

42

Implementación de manejo de errores con express

43

Pruebas básicas de Integración con Ava y supertest

44

Integración con el módulo de base de datos

45

Implementación de ruta del API

46

Pruebas de Integración con Ava, Supertest y Sinon

Asegurando nuestra API REST con JWT

47

Definición de JWT

48

Asegurando nuestra API con express-jwt

49

Modificando las pruebas de integracion

50

Implementando permisos con express-jwt-permissions

Creando un Dashboard Web en tiempo real con WebSockets (platziverse-web)

51

Implementación de un servidor web estático con express

52

Integrando socket.io con express

53

Integrando agente de monitoreo con socket.io

54

Implementación de rutas proxy con la API

55

Presentación de nuestro cliente frontend en Vue.js

56

Integración del cliente frontend con API (Metric)

57

Integración del cliente frontend con socket.io (Metric)

58

Integración del cliente frontend con API (Agent)

59

Integración del cliente frontend con socket.io (Agent)

Creando un Dashboard para la terminal en tiempo real con Blessed (platziverse-cl)

60

Implementación de un CLI Básico con Node

61

Introducción a Blessed / Blessed Contrib

62

Implementación del layout básico con Blessed Contrib

63

Integración con el agente de monitoreo 1

64

Integración con el agente de monitoreo 2

65

Integración con el agente de monitoreo 3

Depurando Aplicaciones Node.js

66

Utilizando longjohn para mejores stacktraces

67

Depurando en Desarrollo con node --inspect

68

Depurando en Desarrollo con Visual Studio Code

Preparando nuestra aplicación para producción

69

Preparando Proyecto para Producción 1

70

Preparando Proyecto para Producción 2

71

Creación de scripts para despliegue con Ansible

72

Probando el database rol con Vagrant

73

Creando scripts del rol de platziverse db y mqtt (script de automatización .yml)

74

Terminando los scripts faltantes

75

Creación de servidores en DigitalOcean

Desplegando nuestra aplicación a producción

76

Ejecutando los Scripts de Despliegue

77

Utilizando Aplicación en Producción y cierre del curso

Bonus: Utilizando platziverse-agent en BeagleBone Black y Raspberry PI

78

Implementación platziverse-agent con Johnny-Five

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Cómo almacenar la información del agente y reportar el agente conectado

32/78
Recursos

Para implementar la persistencia de los mensajes en la base de datos necesitamos tener una referencia de todos los agentes que tenemos conectados. Tenemos que crear un mapa de JavaScript.
Cada vez que un cliente se conecte vamos a capturar el ID y la información del agente. Por ahora no conocemos la información porque no hemos recibido el primer mensaje, así que más adelante le vamos a setear la información.

Después vamos a empezar a trabajar con los mensajes que publican en nuestro servidor. Para eso vamos a optener el topic y hacer un switch.
El switch es una estructura de control de JS que permite ejecutar un código.

Aportes 3

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Hola amigos!, alguien sabe a que se debe este error:

Este es mi código:

'use strict'

const debug = require('debug')('platziverse:mqtt')
const mosca = require('mosca')
// const redis = require('redis')
const mongo = require('mongoose')
const chalk = require('chalk')
const db = require('platziverse-db')
const { configuration } = require('platziverse-utils')
const { parsePayload } = require('./utils')

// const backend = {
//   type: 'redis',
//   redis,
//   return_buffers: true
// }
const backend = {
  type: 'mongoose',
  url: 'mongodb+srv://db_user_platzinodejs:[email protected]/test2?retryWrites=true&w=majority',
  // redis,
  mongo,
  return_buffers: true
}

const settings = {
  port: 1883,
  backend
}

const config = configuration(false) // El setup es falso //Revisar el módulo platziverse-utils

const server = new mosca.Server(settings)
const clients = new Map() // El objeto Map almacena pares clave/valor. Cualquier valor (tanto objetos como valores primitivos) pueden ser usados como clave o valor.

let Agent, Metric

server.on('clientConnected', client => {
  debug(`Client Connected: ${client.id}`)
  clients.set(client.id, null)
})

server.on('clientDisconnected', async client => {
  debug(`Client Disconnected: ${client.id}`)
  const agent = clients.get(client.id)

  if (agent) {
    agent.connected = false // Mark agent as disconnected (Marcar agente como desconectado)
  }

  try {
    await Agent.createOrUpdate(agent)
  } catch (e) {
    return handleError(e)
  }

  clients.delete(client.id)

  server.publish({
    topic: 'agent/disconnected',
    payload: JSON.stringify({
      agent: {
        uuid: agent.uuid
      }
    })
  })

  debug(`Clent (${client.id}) associated to Agent (${agent.uuid}) marked as disconnected`)
})

server.on('published', async (packet, client) => {
  debug(`Received: ${packet.topic}`) // 'topic' viene siendo el tipo de mensaje en este caso sería agent/connected, agent/disconnected

  switch (packet.topic) {
    case 'agent/connected':
    case 'agent/disconnected':
      debug(`Payload: ${packet.payload}`)
      break
    case 'agent/message':
      debug(`Payload: ${packet.payload}`)

      const payload = parsePayload(packet.payload)

      if (payload) {
        payload.agent.connected = true

        let agent
        try {
          agent = await Agent.createOrUpdate(payload.agent)
        } catch (e) { // Si llega un agente con mala información entonces me retorna un error
          return handleError(e)
        }

        debug(`Agent ${agent.uuid} saved`)

        // Notify Agent is connected
        if (!clients.get(client.id)) { // Vamos hacer un broadcast o notificar a todos los clientes que esten conectados en este evento o broker que un agente se conectó
          clients.set(client.id, agent)
          server.publish({
            topic: 'agent/connected',
            payload: JSON.stringify({
              agent: {
                uuid: agent.uuid,
                name: agent.name,
                username: agent.username,
                hostname: agent.hostname,
                pid: agent.pid,
                connected: agent.connected
              }
            })
          })
        }

        // Store Metrics
        for (const metric of payload.metrics) { // Me permite iterar sobre un arreglo y obtener cada uno de los objetos de ese arreglo
          let m // Dentro del for vamos hacer operaciones de async await para almacenar las metricas, es importante utilizar el forof que soporta el async await

          try {
            m = await Metric.create(agent.uuid, metric)
          } catch (error) {
            return handleError
          }
          debug(`Metric ${m.id} save on agent ${agent.uuid}`)
        }
      }
      break
  }

  // Esa informacion que va ser enviada va ha venir en el payload
})

server.on('ready', async () => {
  const services = await db(config).catch(handleFatalError) // Cuando el servidor esta listo yo instancio mi Base de Datos

  Agent = services.Agent
  Metric = services.Metric

  console.log(`${chalk.green('[platziverse-mqtt]')} server is running`)
  // console.log("Activo")
})

server.on('error', handleFatalError)

process.on('uncaughtException', handleFatalError)
process.on('unhandledRejection', handleFatalError)

function handleFatalError (err) {
  console.error(`${chalk.red('[fatal error]')} ${err.message}`) // Imprimimos el mensaje de error
  console.error(err.stack) // Imprimimos el tipo de error que esta ocurriendo
  process.exit(1) // Matamos el proceso retornando un código 1, que es un código de error
}

function handleError (err) {
  console.error(`${chalk.red('[error]')} ${err.message}`) // Imprimimos el mensaje de error
  console.error(err.stack) // Imprimimos el tipo de error que esta ocurriendo
  // process.exit(1) // Matamos el proceso retornando un código 1, que es un código de error
}

.
Saludos!

A ESLint no le gustan las declaraciones let dentro de los bloques de mayúsculas y minúsculas dentro de un reductor, ¿por qué?

Esto se desaconseja porque da como resultado que la variable esté dentro del alcance fuera de su actual case. Al usar un bloque, limita el alcance de la variable a ese bloque.

Use {}para crear el alcance del bloque con mayúsculas y minúsculas, como este:

case ‘agent/message’: {

}

Unexpected lexical declaration in case block.