Introducción
El nodo Código te permite ejecutar código JavaScript personalizado dentro de tus flujos de conversación, dándote la flexibilidad de realizar operaciones complejas, transformaciones de datos y lógica personalizada que no pueden ser realizadas con los nodos estándar.
Acceso a variables
Dentro del nodo código puedes acceder y modificar diferentes tipos de variables usando métodos específicos:
Contexto
El contexto guarda variables que persisten únicamente durante la ejecución actual del flujo. Usa estos métodos:
// Obtener una variable del contexto
const nombre = $context.get('nombre')
// Obtener con valor por defecto si no existe
const nombre = $context.get('nombre', 'Juan')
// Guardar una variable en el contexto
$context.set('ultimoPedido.estado', 'entregado')
// Guardar un objeto completo
const usuario = { nombre: 'Juan', plan: 'gold' }
$context.set('usuario', usuario)
// Guardar un array
const pedidos = ['PED-123', 'PED-456']
$context.set('pedidos', pedidos)
Memoria
La memoria permite persistir datos entre skills, tools y nodos. Con Memory puedes controlar el tiempo de vida (TTL) de cada variable y almacenar diferentes tipos de datos.
Conceptos clave
| Término | Descripción |
|---|
| Key | Nombre de la variable de memoria (ej.: idioma) |
| Value | Dato a almacenar: string, number, boolean, object o file |
| TTL | Tiempo de vida en segundos. Transcurrido el TTL, la clave se elimina automáticamente |
Tipos de datos admitidos
| Tipo | Tamaño máximo | TTL | TTL máximo |
|---|
| String | 255 caracteres | Opcional | - |
| Number | 15 dígitos | Opcional | - |
| Boolean | - | Opcional | - |
| JSON | 5KB | Requerido | 86.400s (1 día) |
| File | 10MB | Requerido | 604.800s (1 semana) |
Escritura
// Primitivos (string, number, boolean) - TTL opcional
$memory.set('nombre', 'Juan')
$memory.set('intentos', 3, 3600) // expira en 1 hora
// JSON - TTL requerido (en segundos)
$memory.setJson('usuario', { nombre: 'Juan', plan: 'gold' }, 86400)
// Archivos - async, TTL requerido, tipo MIME requerido
await $memory.setFile('comprobante', base64String, 604800, 'application/pdf')
Lectura
// Primitivos
const nombre = $memory.get('nombre')
const nombre = $memory.get('nombre', 'Juan') // con valor por defecto
// JSON
const usuario = $memory.getJson('usuario')
const usuario = $memory.getJson('usuario', {}) // con valor por defecto
// Archivos - devuelve FileHandle
const url = $memory.getFile('comprobante').toUrl() // URL temporal (S3)
const base64 = await $memory.getFile('comprobante').toBase64() // string base-64
const buffer = await $memory.getFile('comprobante').toRaw() // Buffer/Uint8Array
Eliminación
// Eliminar una clave
$memory.delete('temporal')
// Eliminar múltiples claves
$memory.delete(['tmp1', 'tmp2', 'cache'])
Tipos MIME permitidos para setFile:| Categoría | Tipos MIME |
|---|
| Texto | text/plain |
| JSON | application/json |
| XML | application/xml, text/xml |
| Imágenes | image/jpeg, image/png, image/gif |
| Videos | video/mp4, video/ogg, video/webm, video/x-msvideo, video/mpeg |
| Audios | audio/mpeg, audio/wav, audio/ogg, audio/aac, audio/flac |
| Documentos | application/pdf |
Los métodos $memory.setFile(), $memory.getFile().toBase64() y $memory.getFile().toRaw() son asincrónicos. Debes usar await al llamarlos.
Usuario
Accede a información del contacto que está interactuando con tu flujo:
// Obtener el ID del usuario
const userId = $user.get('id')
// Obtener el nombre del usuario
const userName = $user.get('names')
Mensaje
Accede al último mensaje que envió el usuario:
// Obtener el texto del mensaje
const texto = $message.get('text')
// Obtener el tipo de mensaje (TEXT, IMAGE, AUDIO, VIDEO, LOCATION, FILE)
const tipo = $message.get('type')
// Obtener la URL del archivo adjunto
const urlAdjunto = $message.get('mediaUrl')
// Obtener coordenadas de ubicación
const lat = $message.get('lat')
const lng = $message.get('lng')
Cuando trabajas con tools, puedes recibir inputs y retornar outputs:
// Obtener un input
const ciudad = $input.get('ciudad')
// Obtener un input con valor por defecto
const ciudad = $input.get('ciudad', 'Quito')
// Establecer un output
const data = $memory.get('apiResponse')
$output.set('data', data)
Respuestas HTTP
Si guardaste una respuesta de un nodo API, puedes accederla y manipularla:
// Obtener la respuesta HTTP guardada
let apiResponse = $context.getHttpResponse('apiResponse')
// Convertir a JSON si es necesario
apiResponse = apiResponse.json()
// Manipular los datos
let usuarioNombre = apiResponse.data.usuario.nombre
let status = apiResponse.status
// Guardar en memoria
$memory.set('usuarioNombre', usuarioNombre);
$memory.set('status', status);
La llave que uses en $context.getHttpResponse('apiResponse') debe coincidir exactamente con la que especificaste en el nodo API en el campo “guardar respuesta”.
Utilidades disponibles
El nodo código incluye varias utilidades que puedes usar en tu código:
Logger
El logger es muy útil para loggear variables dentro de un flujo y facilitar el debugging:
$utils.logger.log('nombreUsuario', nombreUsuario)
$utils.logger.log('resultado', resultado)
$utils.logger.log('datos', { id: 123, estado: 'activo' })
Crypto
Crypto proporciona funcionalidades criptográficas comunes como hash y cifrado:
// Crear un hash
$utils.crypto.createHash(algorithm)
// Crear un HMAC
$utils.crypto.createHmac(algorithm, key)
// Generar bytes aleatorios
$utils.crypto.randomBytes(size)
// Derivación de clave basada en contraseña
$utils.crypto.pbkdf2(password, salt, iterations, keylen, digest)
// Cifrado
$utils.crypto.createCipheriv(algorithm, key, iv)
// Descifrado
$utils.crypto.createDecipheriv(algorithm, key, iv)
// Generar par de claves
$utils.crypto.generateKeyPair(type, options)
// Firmar datos
$utils.crypto.sign(algorithm, data, privateKey)
// Verificar firma
$utils.crypto.verify(algorithm, data, publicKey, signature)
Lodash
Lodash es una biblioteca moderna de utilidades JavaScript que ofrece modularidad, rendimiento y extras, facilitando el trabajo con arrays, números, objetos, cadenas, etc.
// Dividir array en chunks
$utils._.chunk(array, size)
// Debounce de funciones
$utils._.debounce(func, wait)
// Clonar profundamente
$utils._.cloneDeep(value)
// Fusionar objetos
$utils._.merge(object, sources)
// Obtener valor de objeto por path
$utils._.get(object, path, [defaultValue])
// Obtener valores únicos de un array
$utils._.uniq(array)
// Filtrar colección
$utils._.filter(collection, predicate)
// Mapear colección
$utils._.map(collection, iteratee)