Environnement d'exécution Node.js

Votre fonction Cloud Run s'exécute dans un environnement composé d'une version de système d'exploitation avec des packages complémentaires, d'une compatibilité avec les langages et de la bibliothèque du framework des fonctions Node.js compatible avec votre fonction et qui l'appelle. Cet environnement est identifié par la version de langage et est appelé ID d'exécution.

Préparation de la fonction

Vous pouvez préparer une fonction directement depuis la console Google Cloud, ou l'écrire sur votre ordinateur local et l'importer. Pour préparer votre ordinateur local au développement Node.js, consultez Configurer un environnement de développement Node.js.

Environnements d'exécution et images de base Node.js compatibles

Environnement d'exécution ID d'exécution Piles Image de base de l'environnement d'exécution
Node.js 22 nodejs22
  • google-22 (par défaut)
  • google-22-full
  • google-22/nodejs22
  • google-22-full/nodejs22
  • Node.js 20 nodejs20
  • google-22 (par défaut)
  • google-22-full
  • google-22/nodejs20
  • google-22-full/nodejs20
  • Node.js 18 nodejs18
  • google-22 (par défaut)
  • google-22-full
  • google-22/nodejs18
  • google-22-full/nodejs18
  • Node.js 16 nodejs16 google-18-full google-18-full/nodejs16
    Node.js 14 nodejs14 google-18-full google-18-full/nodejs14
    Node.js 12 nodejs12 google-18-full google-18-full/nodejs12
    Node.js 10 nodejs10 google-18-full google-18-full/nodejs10
    Node.js 8 nodejs8 Hors service Hors service
    Node.js 6 nodejs6 Hors service Hors service

    Sélectionner votre environnement d'exécution

    Vous pouvez sélectionner l'un des environnements d'exécution Node.js compatibles pour votre fonction lors du déploiement.

    Vous pouvez sélectionner une version d'exécution à l'aide de la console Google Cloud ou de la gcloud CLI. Cliquez sur l'onglet pour obtenir des instructions concernant l'utilisation de l'outil de votre choix:

    gcloud

    Spécifiez l'image de base Node.js pour votre fonction à l'aide de l'option --base-image lors du déploiement de votre fonction. Exemple :

    gcloud run deploy FUNCTION \
        --source . \
        --function FUNCTION_ENTRYPOINT \
        --base-image nodejs22
    

    Remplacez :

    • FUNCTION par le nom de la fonction que vous déployez. Vous pouvez omettre ce paramètre, mais dans ce cas le nom vous sera demandé.

    • FUNCTION_ENTRYPOINT par le point d'entrée de votre fonction dans votre code source. Il s'agit du code exécuté par Cloud Run lors de l'exécution de votre fonction. La valeur de cette option doit être un nom de fonction ou un nom de classe complet qui existe dans votre code source.

    Pour obtenir des instructions détaillées sur le déploiement d'une fonction à l'aide de la CLI gcloud, consultez Déployer des fonctions dans Cloud Run.

    Console

    Vous pouvez sélectionner une version d'environnement d'exécution lorsque vous créez ou mettez à jour une fonction Cloud Run dans la console Google Cloud. Pour obtenir des instructions détaillées sur le déploiement d'une fonction, consultez Déployer des fonctions dans Cloud Run.

    Pour sélectionner un environnement d'exécution dans la console Google Cloud lorsque vous créez une fonction, procédez comme suit:

    1. Dans la console Google Cloud, accédez à la page Cloud Run :

      Accédez à Cloud Run

    2. Cliquez sur Écrire une fonction.

    3. Dans la liste Environnement d'exécution, sélectionnez une version d'environnement d'exécution Node.js.

    4. Cliquez sur Créer, puis attendez que Cloud Run crée le service à l'aide d'une révision d'espace réservé.

    5. La console vous redirigera vers l'onglet Source, où vous pourrez voir le code source de votre fonction. Cliquez sur Enregistrer et redéployer.

    Pour obtenir des instructions détaillées sur la mise à jour de la version d'exécution après le déploiement de votre fonction, consultez la section Redéployer le nouveau code source.

    Structure du code source

    Pour que Cloud Run Functions trouve la définition de votre fonction, votre code source doit respecter une structure spécifique. Pour en savoir plus, consultez la page Écrire des fonctions Cloud Run.

    Spécifier des dépendances

    Vous pouvez spécifier des dépendances pour vos fonctions en les répertoriant dans un fichier package.json. Pour en savoir plus, consultez la page Spécifier des dépendances dans Node.js.

    Script de compilation NPM

    Par défaut, l'environnement d'exécution Node.js exécute npm run build si un script build est détecté dans le projet package.json. Si vous avez besoin d'exercer un contrôle supplémentaire sur vos étapes de compilation avant de démarrer votre application, vous pouvez fournir une étape de compilation personnalisée en ajoutant un script gcp-build à votre fichier package.json.

    Vous pouvez empêcher votre compilation d'exécuter le script npm run build de l'une des manières suivantes :

    • En ajoutant un script gcp-build avec une valeur vide dans votre fichier package.json : "gcp-build":"".

    • En définissant la variable d'environnement de compilation GOOGLE_NODE_RUN_SCRIPTS sur la chaîne vide pour empêcher tous les scripts de s'exécuter.

    Exécution asynchrone de la fonction

    Lorsque vous travaillez avec des tâches asynchrones qui impliquent des rappels ou des objets Promise, vous devez explicitement informer l'environnement d'exécution que votre fonction a terminé l'exécution de ces tâches. Vous pouvez effectuer cette opération de différentes manières, comme indiqué dans les exemples suivants. L'essentiel est que votre code attende que la tâche asynchrone ou Promise se termine avant de renvoyer, faute de quoi le composant asynchrone de votre fonction risque d'être interrompu avant qu'il ne se termine.

    Fonctions basées sur les événements

    Renvoi implicite

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

    Renvoi explicite

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

    Fonctions HTTP

    // 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();

    Utiliser un middleware pour gérer les requêtes HTTP

    Afin de simplifier le traitement des requêtes HTTP, les fonctions HTTP Node.js fournissent des objets request et response compatibles avec ExpressJS. Les fonctions Cloud Run lisent automatiquement le corps de la requête. Vous recevrez donc toujours le corps d'une requête indépendamment du type de contenu. Ainsi, les requêtes HTTP doivent être considérées comme ayant été entièrement lues au moment de l'exécution de votre code. L'imbrication avec des applications ExpressJS est possible à condition de prendre cela en compte. En effet, certains composants middleware ne s'attendant pas à ce que le corps d'une requête soit préalablement lu risquent de ne pas se comporter comme prévu.

    Utiliser des modules ES

    Les modules ECMAScript (modules ES ou ESM) sont une fonctionnalité standard TC39 non signalée dans Node version 14 et ultérieure, qui permet de charger des modules JavaScript. Contrairement à CommonJS, ESM fournit une API asynchrone pour le chargement de modules. Il fournit également une amélioration appréciée de la syntaxe via les instructions import et export, qui peuvent être utilisées dans une fonction Cloud Run au lieu d'instructions require.

    Pour utiliser ESM dans une fonction Cloud Run, vous devez déclarer "type": "module" dans votre fichier package.json.

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

    Vous pouvez alors utiliser les instructions import et export.

    En savoir plus sur l'utilisation des modules ES