Entonces, estoy trabajando en un nodo personalizado con un montón de opciones de configuración. No es terriblemente complejo, solo está bastante ocupado. Una de las cosas en las que he estado devanándome los sesos es cómo manejar las credenciales – básicamente tengo cuatro opciones diferentes en dos conjuntos distintos.
La primera opción que los usuarios tienen es si las credenciales están “hardcodeadas” como un objeto credential (basado en una definición .credentials.ts) o se proporcionan dinámicamente en las propiedades del nodo (definidas en el archivo .node.ts), para casos donde un único pipeline podría usarse en un entorno de múltiples sitios (permitiendo que las credenciales se pasen dinámicamente desde una fuente segura; el “desde dónde” está fuera de mi alcance de influencia, así que este parecía ser el enfoque más racional).
La segunda opción es si proporcionan un token API directamente o proporcionan una contraseña que se usa para recuperar un token. Si el usuario proporciona un token, simplemente se codifica y se coloca en un encabezado Auth para cualquier solicitud – sin problema. Pero si proporcionan una contraseña, el nodo necesita hacer una solicitud “especial” primero, con un encabezado Auth personalizado que contiene una cadena codificada en base64 construida a partir del nombre de usuario y la contraseña, y el token se devuelve desde eso.
Después de avanzar parcialmente en la implementación de esto, me di cuenta de que tenía que manejar mucho de esto manualmente, así que el archivo .credentials.ts simplemente recopila datos (si el usuario va por esa ruta) – igual que las entradas del nodo. Tengo una función apiRequest() definida y exportada desde un archivo separado que maneja las solicitudes API en sí, y una función getApiToken() en ese mismo archivo (no exportada – solo se usa en apiRequest() en este momento) que maneja específicamente la solicitud del token.
Los usuarios pueden elegir una u otra para cualquiera de las dos. De todas formas, las entradas son las mismas: nombre de usuario, URL del sitio, y contraseña o token API. Ya había tenido todo esto funcionando sin la opción de usar una contraseña, pero me embarqué en esa búsqueda hoy, y lo tengo funcionando con la opción de credenciales dinámicas, pero esto parece haber roto la capacidad de extraer las credenciales de la configuración basada en .credentials.ts.
He reducido el problema a un bloque de código en el archivo .node.ts, que es simplemente una serie de asignaciones condicionales.
Primero, declara una variable – credentials – e intenta usar getCredentials() para extraerlas de la configuración .credentials.ts. Si no están presentes, hay una captura de error que simplemente establece credentials en undefined. Inmediatamente después, se declara una constante – dynamicConnection – que usa getNodeParameter() para obtener las entradas de la entrada de propiedades del nodo (cada propiedad es type-safe, especificada como un string) – así que si no hay nada ahí, simplemente son null. Luego, se crea un objeto connection donde cada una de las cuatro propiedades se asigna basándose en verificaciones condicionales de las propiedades de los objetos credentials y dynamicConnection. Para cada una, verificamos si el objeto credentials.<prop> contiene una cadena; si es así se asigna, y si no hacemos lo mismo para dynamicConnection. Si ninguno contiene un valor string, por defecto es undefined. Finalmente, una condición if() verifica que tengamos (a) un nombre de usuario, (b) una URL de instancia, y (c) una contraseña o un token; si alguna de esas condiciones no se cumple, lanza un error. Esa condición if() se lee como “si NO nombre de usuario -O- NO URL del sitio -O- ( NO token api -Y- NO contraseña): lanza un error.”
Esto funciona bien para la entrada dinámica de credenciales, pero si intento hacer esto con credenciales guardadas, me devuelven el error de ese bloque if(), como si faltara algo, aunque sé que todos los campos están ahí. Críticamente – esto funcionaba bien antes de que agregara la propiedad password a connection, así que genuinamente no creo que sea un problema de asignación o esperaría que hubiera fallado antes de implementar el campo de contraseña.
Siento que me estoy perdiendo algo absolutamente estúpido, pero espero que alguien aquí tenga más perspectiva sobre esto que yo mismo. ¿O al menos que puedas confirmar que no estoy loco? ¡Por favor y gracias!