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!