Entorno de ejecución de Node.js

Tu función de Cloud Run se ejecuta en un entorno que consta de una versión del sistema operativo, además de paquetes complementarios, compatibilidad con idiomas y la biblioteca Functions Framework, que admite e invoca tu función. Este entorno se identifica por la versión del idioma y se conoce como "tiempo de ejecución".

Para obtener información sobre los entornos de ejecución en general y saber qué versión de Ubuntu usa cada entorno de ejecución de Node.js, consulta el entorno de ejecución de Cloud Run Functions.

Para empezar a crear y desplegar funciones de Cloud Run con Node.js, consulta la guía de inicio rápido.

Para compilar y probar tus funciones en tu sistema local, consulta Ejecutar funciones con el framework de Functions.

Selecciona el tiempo de ejecución

Las funciones de Cloud Run admiten varias versiones de Node.js, que se indican en la página Compatibilidad con entornos de ejecución. Puedes seleccionar el tiempo de ejecución de Node.js que prefieras para tu función durante la implementación:

Entorno de ejecución

El entorno de ejecución incluye el tiempo de ejecución, el sistema operativo, los paquetes y una biblioteca que invoca tu función.

Node.js 18 y las versiones posteriores usan un entorno de ejecución basado en Ubuntu 22.04. Las versiones anteriores a Node.js 18 se basan en Ubuntu 18.04. Para obtener más información, consulta el artículo sobre el entorno de ejecución de funciones de Cloud Run.

La biblioteca que invoca tu función es el framework de funciones de Node.js.

Estructura del código fuente

Para que las funciones de Cloud Run puedan encontrar la definición de tu función, cada entorno de ejecución tiene ciertos requisitos de estructura para tu código fuente. Para obtener más información, consulta el artículo sobre cómo escribir funciones de Cloud Run.

Especificar dependencias

Puedes especificar las dependencias de tus funciones incluyéndolas en un archivo package.json. Para obtener más información, consulta Especificar dependencias en Node.js.

Secuencia de comandos de compilación de NPM

De forma predeterminada, el entorno de ejecución de Node.js ejecuta npm run build si se detecta una secuencia de comandos build en package.json. Si necesitas tener más control sobre los pasos de compilación antes de iniciar la aplicación, puedes proporcionar un paso de compilación personalizado añadiendo una secuencia de comandos gcp-build al archivo package.json.

Para evitar que tu compilación ejecute la secuencia de comandos npm run build, puedes hacer lo siguiente:

  • Añadir una secuencia de comandos gcp-build con un valor vacío en el archivo package.json: "gcp-build":"".

  • Asignar a la variable de entorno de compilación GOOGLE_NODE_RUN_SCRIPTS la cadena vacía para evitar que se ejecuten todas las secuencias de comandos.

Finalización de funciones asíncronas

Cuando trabajes con tareas asíncronas que impliquen retrollamadas u objetos Promise, debes informar explícitamente al tiempo de ejecución de que tu función ha terminado de ejecutar estas tareas. Puedes hacerlo de varias formas, como se muestra en los siguientes ejemplos. La clave es que tu código debe esperar a que se complete la tarea asíncrona o Promise antes de devolver un valor. De lo contrario, el componente asíncrono de tu función puede finalizar antes de completarse.

Funciones basadas en eventos

Devolución implícita

  exports.implicitlyReturning = async (event, context) => {
    return await asyncFunctionThatReturnsAPromise();
  };

Devolución explícita

  exports.explicitlyReturning = function (event, context) {
    return asyncFunctionThatReturnsAPromise();
  };

Funciones HTTP

Node.js

// OK: await-ing a Promise before sending an HTTP response
await Promise.resolve();

// WRONG: HTTP functions should send an
// HTTP response instead of returning.
return Promise.resolve();

// HTTP functions should signal termination by returning an HTTP response.
// This should not be done until all background tasks are complete.
res.send(200);
res.end();

// WRONG: this may not execute since an
// HTTP response has already been sent.
return Promise.resolve();

Usar middleware para gestionar solicitudes HTTP

Las funciones de Cloud Run HTTP de Node.js proporcionan objetos request y response que son compatibles con ExpressJS para simplificar el consumo de solicitudes HTTP. Cloud Run Functions lee automáticamente el cuerpo de la solicitud, por lo que siempre recibirás el cuerpo de una solicitud independientemente del tipo de contenido multimedia. Esto significa que las solicitudes HTTP se habrán leído por completo cuando se ejecute el código. Las aplicaciones ExpressJS anidadas deben usarse con esta advertencia. En concreto, es posible que el middleware que espera que el cuerpo de una solicitud no se haya leído no se comporte como se espera.

Usar módulos ES

Los módulos ECMAScript (módulos ES o ESM) son una función estándar de TC39 que no está marcada en Node versión 14 o posterior para cargar módulos JavaScript. A diferencia de CommonJS, ESM proporciona una API asíncrona para cargar módulos. También proporciona una mejora de sintaxis popular con las instrucciones import y export, que se pueden usar en una función de Cloud Run (en lugar de las instrucciones require).

Para usar ESM en una función de Cloud Run, debes declarar "type": "module" en tu package.json.

{
  ...
  "type": "module",
  ...
}

Después, puedes usar las instrucciones import y export.

.