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 de complementos, compatibilidad con lenguajes y la biblioteca de Functions Framework que admite e invoca la función. Este entorno se identifica mediante la versión del lenguaje y se conoce como el entorno 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 funciones de Cloud Run.

Para comenzar a compilar e implementar funciones de Cloud Run con Node.js, consulta la guía de inicio rápido.

Para compilar y probar tus funciones en el sistema local, consulta Ejecuta funciones con Functions Framework.

Selecciona el entorno de ejecución

Las funciones de Cloud Run admite varias versiones de Node.js, que se enumeran en la página Compatibilidad con el entorno de ejecución. Puedes seleccionar el entorno de ejecución de Node.js deseado para tu función durante la implementación.

Entorno de ejecución

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

Node.js 18 y las versiones más recientes usan un entorno de ejecución basado en Ubuntu 22.04. Las versiones anteriores a Node.js 18 se basan en Ubuntu 18.04. Consulta Entorno de ejecución de funciones de Cloud Run para obtener más información.

La biblioteca que invoca tu función es el framework de funciones del nodo.

Estructura del código fuente

A fin de que las funciones de Cloud Run encuentren la definición de tu función, cada entorno de ejecución tiene ciertos requisitos de estructura para el código fuente. Consulta Escribe funciones de Cloud Run para obtener más información.

Especificar dependencias

A fin de especificar dependencias para tus funciones, enuméralas en un archivo package.json. Para obtener más información, consulta Especifica 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 control adicional sobre tus pasos de compilación antes de iniciar tu aplicación, puedes proporcionar un paso de compilación personalizado si agregas una secuencia de comandos gcp-build a tu archivo package.json.

Puedes evitar que tu compilación ejecute la secuencia de comandos npm run build de las siguientes maneras:

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

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

Finalización asíncrona de funciones

Cuando trabajas con tareas asíncronas que implican devoluciones de llamada u objetos Promise, debes informarle explícitamente al entorno de ejecución que tu función terminó de ejecutar estas tareas. Puedes hacerlo de varias maneras diferentes, 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 mostrar el resultado. de lo contrario, el componente asíncrono de tu función puede finalizar antes de que se complete.

Funciones controladas por eventos

Muestra implícita

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

Muestra explícita

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

Funciones de 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();

Usa middleware para controlar solicitudes HTTP

Las funciones de Cloud Run HTTP para Node.js proporcionan objetos request y response que son compatibles con ExpressJS a fin de simplificar el consumo de solicitudes HTTP. Funciones de Cloud Run lee automáticamente el cuerpo de la solicitud, de manera que siempre recibirás el cuerpo de una solicitud más allá del tipo de medio. Esto quiere decir que las solicitudes HTTP se considerarán como completamente leídas para el momento en que tu código se ejecuta. La anidación de las aplicaciones de ExpressJS debe usarse con esta salvedad: en particular, puede que el middleware que espera que el cuerpo de una solicitud no se haya leído no se comporte como se prevé.

Usa módulos de ES

Los módulos de ECMAScript (módulos de ES o ESM) son una función estándar de TC39 sin marca en la versión de Node 14+ para cargar módulos de JavaScript. A diferencia de CommonJS, ESM proporciona una API asíncrona para cargar módulos. También proporciona una mejora de la sintaxis popular a través de las declaraciones import y export que se pueden usar dentro de una función de Cloud Run (en lugar de las declaraciones require).

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

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

Luego, puedes usar las declaraciones import y export.