Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

126
Vistas
¿Cómo configurar process.env desde una función?

Estoy muy abierto a saber si hay una mejor forma de "mejores prácticas" para hacer esto, pero tengo algunos scripts que ejecuto ocasionalmente que editan una base de datos, por lo que necesito pasar la contraseña de la base de datos para esos scripts. Obtengo la contraseña llamando a una función que llama a Google Cloud Secrets Manager, y no puedo agregarla a process.env.

por ejemplo, si pongo esto en la parte superior de mi archivo de script:

 process.env.DB_HOST='127.0.0.1'; process.env.DB_USER='michael'; process.env.DB_NAME='staging-db'; process.env.DB_PORT=1234; process.env.DB_PASS= await accessSecret('projects/myproject-123/secrets/DB_PASS/versions/latest');

Cuando se ejecuta lo anterior me sale el error
SyntaxError: await is only valid in async functions and the top level bodies of modules

Pero, si muevo la configuración de process.env.DB_PASS dentro de mi función async main(), entonces tiene un alcance local para esa función principal. Otros archivos llamados por funciones en este script ven process.env.DB_PASS como indefinido (pero ven valores para cualquier variable de process.env establecida globalmente en la parte superior del archivo.

¿Cómo accedo y configuro ese secreto sin pegar el secreto literal en el código?

Para representar el problema del alcance, aquí hay una recreación de código de trabajo de ese problema en acción. Este es el archivo de script que estoy ejecutando:

 process.env.DB_HOST='127.0.0.1'; process.env.DB_USER='michael'; process.env.DB_NAME='staging-db'; process.env.DB_PORT=1234; const db = require('../../src/database/process_pull_test'); const main = async () => { process.env.SCOPED_KEY = "helloimscoped" db.hello(); } main().catch((e) => {console.error(e)});

Aquí está el archivo process_pull_test

 console.log("SCOPED KEY", process.env.SCOPED_KEY); const dbHost = process.env.DB_HOST; const dbUser = process.env.DB_USER; const dbName = process.env.DB_NAME; const dbPort = process.env.DB_PORT; const scopedKey = process.env.SCOPED_KEY; async function hello() { console.log(dbHost); console.log(dbUser); console.log(dbName); console.log(dbPort); console.log(scopedKey); return console.log("Hello Secrets"); } module.exports = { hello: hello }

Y, aquí está la salida

 SCOPED KEY undefined 127.0.0.1 michael staging-db 1234 undefined Hello Secrets
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Pero, si muevo la configuración de process.env.DB_PASS dentro de mi función async main(), entonces tiene un alcance local para esa función principal. Otros archivos llamados por funciones en este script ven process.env.DB_PASS como indefinido (pero ven valores para cualquier variable de process.env establecida globalmente en la parte superior del archivo.

Esto no es correcto, se configurará globalmente. Lo más probable es que sus otros archivos se ejecuten antes de que se ejecute su main().

En general, la solución es simplemente asegurarse de que después de configurar las variables de entorno en main() , llame a todas las demás lógicas. Esto significa que toda su lógica debe estar en funciones.

over 4 years ago · Santiago Trujillo Denunciar

0

Por lo general, utiliza algún tipo de herramienta de configuración como dotenv o config para administrar la configuración y los secretos de la aplicación. Asegúrese de NO guardar los archivos secretos en el control de código fuente.

Para obtener su secreto de base de datos, debe realizar una llamada asíncrona a Google y obtener la respuesta antes de intentar leer cualquier variable que necesite esos datos.

Asumiré que solo está ejecutando esto desde la línea de comando.

Primero necesitará un iife asíncrono para ejecutar su principal:

 (async () => { // you could put your main code here. await main(); })();

A continuación, agregue un requerimiento a su administrador de secretos de Google. Puede ir a cualquier lugar, pero debe asegurarse de tener acceso a él donde solo lo llama una vez. También podría hacerlo en su archivo principal.

 const gcsm = require('./secretManager');

Luego llame a su administrador de secretos de Google en main. (Estoy inventando la API) y configure su env. También deberá esperar su llamada a db.hello() cuando realmente coloque el código asíncrono en él. Técnicamente, no necesita hacerlo con el código tal como está escrito.

 const main = async () => { const dbPassword = await gcsm.getSecret('some config location'); process.env.DB_PASS = dbPassword; process.env.SCOPED_KEY = "helloimscoped" await db.hello(); }

En hello() en process_pull_test, lea la variable env.

 async function hello() { console.log(process.env.DB_PASS); console.log(dbHost); console.log(dbUser); console.log(dbName); console.log(dbPort); console.log(scopedKey); // note the following line doesn't return anything because // console.log returns undefined. You probably want to return a // string value to test for now. return console.log("Hello Secrets"); }

Esto debería ponerte en marcha.

Comentarios adicionales:

  • Cuando registra SCOPED_KEY por primera vez en process_pull_test, no tiene alcance, solo se registra en el momento requerido y aún no está definido.
  • Cuando registra scopedKey en hello(), aún no está definido porque lo configuró en el momento requerido en la parte superior de process_pull_test.
  • Cuando configura SCOPED_KEY en main(), es demasiado tarde, ya lo guardó en scopedKey como indefinido en el momento requerido. Si configurara scopedKey en process.env.SCOPED_KEY en hello() antes de iniciar sesión, vería su valor actualizado.
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda