Mixpanel y NodeJs: Seguimiento de eventos

Mixpanel

Seguimiento de eventos con Mixpanel y NodeJs, ¡La magia del Callback en Async scope!

No voy a explicar qué es Mixpanel y por qué decidimos usarlo en
supermanos, el enfoque aquí está en un desafío que enfrentamos y cómo lo abordamos.


Caso de uso:

Hemos estado trabajando en la integración de un servicio de seguimiento de eventos a una de nuestras API de back-end, para que podamos tener una visión clara del comportamiento y la interacción de nuestros usuarios con nuestra plataforma, para que podamos priorizar las funciones y administrar las iteraciones de construcción de una manera más amigable para el usuario. manera orientada, y nuestra integración de elección es Mixpanel.

El desafío que estamos tratando de resolver:

Las funciones de la biblioteca Mixpanel NodeJs se construyen como una devolución de llamada (callback) y nuestra base de código es una aplicación ExpressJs encapsulada en un AWS Lambda usando el marco sin servidor y en nuestra base de código estamos usando async/await, y el La pregunta en ese momento era cómo integrar el comportamiento de devolución de llamada dentro de una función async/await.

Lo que hicimos primero 👇

// Customer Model
// path: /src/models/customer-model.js

// database interface instance
// we are using knex.js -> https://knexjs.org
const db = require('../configs/database-configs.js');

const mixpanel = require('../services/mixpanel-service.js');

class Customer extends User {
  constructor(fullName, email, address, brand) {
    super(fullName, email, address);
  }

  async create() {
    const { fullName, email, address, brand } = this;
    try {
      await db('customers').insert({ fullName, email, address, brand });
      await mixpanel.track('customer creation succeed', { fullName, email, address, brand });
    } catch (error) {
      await mixpanel.track('customer creation failed', { fullName, email, address, brand });
    }
  }
}
// Mixpanel Service
// path: /src/services/mixpanel-service.js

const mixpanel = require('mixpanel').init('<TOKEN>');

// We tried to wrap it with async/await to consist the
// codebase style and to avoid callback hell.
async function track(event, properties) {
  await mixpanel.track(event, properties)
}

module.exports = { track

El código anterior no hizo nada en términos de seguimiento, no arrojó ningún error y la función no se comportó como una función async/await incluso después de que la envolviéramos con async/await, porque la ejecución no está regida por el contenedor.

Como secuencia de ejecución de código y sintaxis, no hay nada malo, pero el comportamiento de ejecución del código no coincide con el comportamiento esperado.

La solución que encontramos:

La solución simple y directa que consideramos fue usar promisify para obligar a mixpanel-service a adaptar el comportamiento async/await (promesa de devolución) envolviendo la función de seguimiento con promisify para cambiarla a una función que devuelve una promesa.

// Mixpanel Service
// path: /src/services/mixpanel-service.js
const util = require('util');
const mixpanel = require('mixpanel').init('<TOKEN>');
const trackAsync = util.promisify(mixpanel.track);
// We tried to wrap it with async/await to consist the
// codebase style and to avoid callback hell.
async function track(event, properties) {
 await trackAsync(event, properties)
}
module.exports = { track }

El código anterior coincidió con el resultado esperado y registró los eventos dentro del tablero de nuestro proyecto Mixpanel.


Notas para llevar:

– Lea la biblioteca que desea usar en su proyecto y comprenda su comportamiento e implementaciones.

– Envolver la función basada en la devolución de llamada en el bloque async/await no cambiará el comportamiento de esa función si no hay una implementación prometedora para esa función

– Aprender haciendo e investigando es un gran placer.

Si tiene alguna inquietud o comentario, soy todo oídos. 👂

¡Saludos!

Recent Post