Un handler Node.js permet de répondre aux événements et d'exécuter votre logique métier. Cette rubrique décrit le concept et la structure des handlers Node.js, avec des exemples à l'appui.
Qu'est-ce qu'un handler ?
Le handler d'une fonction FC correspond à la méthode de votre code qui traite les requêtes. Lors de l'invocation de votre fonction FC, Function Compute exécute le handler configuré pour traiter la requête. Vous pouvez configurer le handler dans la console Function Compute via le paramètre Handler.
Pour une fonction FC Node.js, le format du handler est filename.methodName. Par exemple, si votre fichier s'appelle index.js ou index.mjs et que la méthode se nomme handler, le handler sera index.handler.
Pour plus d'informations sur les fonctions FC et les opérations associées, consultez Créer une fonction déclenchée par événement.
Les configurations des handlers doivent respecter les spécifications de configuration de Function Compute. Ces spécifications varient selon le type de handler.
Signature du handler
Function Compute prend en charge les modules ECMAScript (ES) à partir du runtime Node.js 18. Auparavant (Node.js 16 et versions antérieures), Function Compute ne prenait en charge que les modules CommonJS. Pour plus d'informations, consultez Spécifier un handler comme module ES.
Un handler d'événement simple possède la signature suivante :
Node.js 18 ou Node.js 20
Module ES
Cet exemple de code prend en charge le déploiement en un clic. Vous pouvez déployer le code directement dans Function Compute (FC).start-fc3-nodejs-es
// index.mjs
export const handler = async (event, context) => {
console.log("receive event: \n" + event);
return "Hello World!";
};
Module CommonJS
// index.js
exports.handler = async function(event, context) {
console.log("receive event: \n" + event);
return "Hello World!";
};
Node.js 16 et versions antérieures
// index.js
exports.handler = async function(event, context, callback) {
console.log("event: \n" + event);
callback(null, 'hello world');
};
L'exemple de code ci-dessus se décrit comme suit :
handler est le nom de la méthode, correspondant au Handler configuré dans la console Function Compute. Par exemple, si vous spécifiez index.handler comme Handler lors de la création d'une fonction, Function Compute charge la fonction handler définie dans index.js et lance son exécution.
Le runtime Function Compute transmet les paramètres de requête au handler. Le premier paramètre est l'objet event, qui contient la charge utile de la requête. Cet objet event est de type Buffer ; vous pouvez le convertir vers le type d'objet souhaité. Le second paramètre est l'objet context, fournissant les informations contextuelles du runtime pour l'invocation. Pour plus d'informations, consultez Contexte.
Avec le runtime Node.js 18 ou ultérieur, privilégiez la fonctionnalité Async/Await plutôt que le
callback.Function Compute convertit le résultat retourné en fonction de son type.
Type Buffer : retourné tel quel.
Type Object : converti au format JSON puis retourné.
Autres types : convertis en chaîne de caractères puis retournés.
Async/Await
Dans un environnement runtime Node.js 18 ou ultérieur, l'approche Async/Await est recommandée. Elle offre une écriture concise et lisible du code asynchrone en Node.js, évitant ainsi les callbacks imbriqués ou les appels chaînés.
Sous le runtime Node.js 16 ou une version antérieure, vous devez utiliser explicitement la méthode callback pour envoyer une réponse. À défaut, la requête expirera.
Comparée aux fonctions de rappel callback, l'approche Async/Await présente les avantages suivants :
Meilleure lisibilité : Le code utilisant
async/awaitadopte une structure linéaire et synchrone, facilitant sa compréhension et sa maintenance. L'absence de callbacks profondément imbriqués rend la structure du code plus claire.Débogage et gestion des erreurs simplifiés : Les blocs
try-catchpermettent de capturer et gérer plus aisément les erreurs dans les opérations asynchrones. La pile d'erreurs étant plus explicite, vous pouvez identifier l'origine d'une erreur avec plus de précision.Efficacité accrue : Les callbacks nécessitent souvent des bascules entre différentes parties du code. L'approche
async/awaitréduit ces changements de contexte, améliorant ainsi l'efficacité du code.
Exemple 1 : Analyser des paramètres au format JSON
Exemple de code
Function Compute transmet directement les paramètres au format JSON à votre fonction. Il vous appartient de les analyser dans votre code. L'extrait suivant montre comment analyser un événement au format JSON.
Module ES
Cet exemple fonctionne uniquement avec les runtimes Node.js 18 et ultérieurs.
export const handler = async (event, context) => {
var eventObj = JSON.parse(event.toString());
return eventObj['key'];
};
Module CommonJS
Cet exemple de code prend en charge le déploiement en un clic. Vous pouvez déployer ce code dans Function Compute (FC) en un seul clic.start-fc3-nodejs-json
exports.handler = function(event, context, callback) {
var eventObj = JSON.parse(event.toString());
callback(null, eventObj['key']);
};
Prérequis
Créez une fonction Node.js. Pour plus d'informations, consultez Créer une fonction déclenchée par événement. Si vous souhaitez spécifier votre code comme module ES, sélectionnez Node.js 18 ou Node.js 20 comme runtime lors de la création de la fonction.
Procédure
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
-
Sur la page de configuration de la fonction, sélectionnez l'onglet Code. Dans l'éditeur de code, saisissez l'exemple de code précédent, puis cliquez sur Deploy.
RemarqueDans l'exemple de code précédent, le handler de la fonction correspond à la méthode
handlersituée dansindex.js. Si le handler de votre fonction est configuré différemment, mettez à jour le fichier et la méthode correspondants. -
Sous l'onglet Code, cliquez sur l'icône
située à droite de Test Function. Dans la liste déroulante, sélectionnez Configure Test Parameters. Saisissez les paramètres de test suivants, puis cliquez sur OK.{ "key": "value" } -
Cliquez sur Test Function.
Une fois la fonction exécutée avec succès, vérifiez la réponse. Celle-ci doit être
value.
Exemple 2 : Lire et écrire en toute sécurité des ressources OSS à l'aide d'une paire AccessKey temporaire
Exemple de code
Utilisez la paire AccessKey temporaire fournie par Function Compute pour accéder à Object Storage Service (OSS). Le code suivant fournit un exemple.
Module ES
Cet exemple s'exécute uniquement sous les runtimes Node.js 18 ou ultérieurs.
// index.mjs
import OSSClient from 'ali-oss';
export const handler = async (event, context) => {
console.log(event.toString());
var ossClient = new OSSClient({
accessKeyId: context.credentials.accessKeyId,
accessKeySecret: context.credentials.accessKeySecret,
stsToken: context.credentials.securityToken,
region: 'oss-cn-shenzhen',
bucket: 'my-bucket',
});
try {
const uploadResult = await ossClient.put('myObj', Buffer.from('hello, fc', "utf-8"));
console.log('upload success, ', uploadResult);
return "put object"
} catch (error) {
throw error
}
};
Description du code :
context.credentials: Récupère la paire AccessKey temporaire depuis le paramètre context. Cela évite d'inscrire en dur dans le code des informations sensibles telles que des mots de passe.myObj: Nom de l'objet OSS.Buffer.from('hello, fc', "utf-8"): Contenu de l'objet à télécharger.return "put object": Retourneput objectsi le téléchargement réussit.throw err: Lève une exception en cas d'échec du téléchargement.
Module CommonJS
Cet exemple de code prend en charge le déploiement en un clic. Déployez ce code dans Function Compute (FC) en un seul clic.start-fc3-nodejs-oss
var OSSClient = require('ali-oss');
exports.handler = function (event, context, callback) {
console.log(event.toString());
var ossClient = new OSSClient({
accessKeyId: context.credentials.accessKeyId,
accessKeySecret: context.credentials.accessKeySecret,
stsToken: context.credentials.securityToken,
region: `oss-${context.region}`,
bucket: process.env.BUCKET_NAME,
});
ossClient.put('myObj', Buffer.from('hello, fc', "utf-8")).then(function (res) {
callback(null, 'put object');
}).catch(function (err) {
callback(err);
});
};
Description du code :
context.credentials: Récupère la paire AccessKey temporaire depuis le paramètrecontext. Cela évite d'inscrire en dur dans le code des informations sensibles telles que des mots de passe.myObj: Nom de l'objet OSS.Buffer.from('hello, fc', "utf-8"): Contenu de l'objet à télécharger.callback(null, 'put object'): Retourneput objectsi le téléchargement réussit.callback(err): Retourneerren cas d'échec du téléchargement.
Prérequis
Configurez un rôle pour le service disposant des permissions nécessaires pour accéder à OSS. Pour plus d'informations, consultez Accorder à Function Compute des permissions d'accès à d'autres services cloud via des rôles de fonction.
Créez une fonction utilisant le runtime Node.js. Pour plus d'informations, consultez Créer une fonction déclenchée par événement. Si vous souhaitez spécifier le code comme module ES, définissez le runtime sur Node.js 18 ou Node.js 20 lors de la création de la fonction.
Procédure
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
-
(Facultatif) Sous l'onglet Function Details de la fonction, cliquez sur l'onglet Code. Dans la section WebIDE, choisissez pour ouvrir un terminal. Exécutez ensuite la commande suivante afin d'installer la dépendance ali-oss.
npm install ali-oss --saveUne fois l'installation terminée, le dossier
node_modulesapparaît dans le répertoire de code situé à gauche du WebIDE. Ce dossier contient le répertoireali-ossainsi que d'autres bibliothèques de dépendances. -
Sous l'onglet Function Details de la fonction, cliquez sur l'onglet Code. Dans l'éditeur de code, saisissez l'exemple de code fourni ci-dessus. Enregistrez ensuite le code et cliquez sur Deploy.
RemarqueDans cet exemple, le handler de la fonction correspond à la méthode
handlersituée dans le fichierindex.jsouindex.mjs. Si votre fonction utilise un autre handler, mettez à jour le fichier et la méthode en conséquence.Vous devez définir
regionetbucketselon vos besoins spécifiques.
-
Cliquez sur Test Function.
Après l'exécution de la fonction, consultez le résultat retourné. Celui-ci devrait être
put object.
Exemple 3 : Appeler une commande externe
Un programme Node.js peut également créer un processus fork pour invoquer des commandes externes. Par exemple, le module child_process permet d'appeler la commande Linux ls -l afin de lister les fichiers du répertoire courant. Le code suivant en fournit un exemple.
Module ES
Cet exemple s'exécute uniquement sous les runtimes Node.js 18 et ultérieurs.
'use strict';
import { exec } from 'child_process';
import { promisify } from 'util';
const execPromisify = promisify(exec);
export const handler = async (event, context) => {
try {
const { stdout, stderr } = await execPromisify("ls -l");
console.log(`stdout: ${stdout}`);
if (stderr !== "") {
console.error(`stderr: ${stderr}`);
}
return stdout;
} catch (error) {
console.error(`exec error: ${error}`);
return error;
}
}
Module CommonJS
Ce code prend en charge le déploiement en un clic. Vous pouvez déployer ce code dans Function Compute (FC) en un seul clic.start-fc3-nodejs-exec
'use strict';
var exec = require('child_process').exec;
exports.handler = (event, context, callback) => {
console.log('start to execute a command');
exec("ls -l", function(error, stdout, stderr){
callback(null, stdout);
});
}
Exemple 4 : Appeler une fonction à l'aide d'un déclencheur HTTP
Exemple de code
Utilisez l'URL fournie par le déclencheur HTTP pour appeler la fonction. Le code suivant en est un exemple.
Si la Authentication Method du déclencheur HTTP est définie sur No Authentication, utilisez Postman ou une commande curl pour appeler la fonction. Pour plus d'informations, consultez Procédure.
Si la Authentication Method du déclencheur HTTP est définie sur Signature Authentication, JWT authentication or Bearer authentication, utilisez la méthode d'authentification correspondante pour appeler la fonction. Pour plus d'informations, consultez Authentification.
Pour obtenir des informations sur les formats de charge utile des requêtes et des réponses lors d'appels via des déclencheurs HTTP, consultez Appeler une fonction à l'aide d'un déclencheur HTTP.
Module ES
Cet exemple fonctionne uniquement avec les runtimes Node.js 18 ou ultérieurs.
'use strict';
export const handler = async (event, context) => {
const eventObj = JSON.parse(event);
console.log(`receive event: ${JSON.stringify(eventObj)}`);
let body = 'Hello World!';
// get http request body
if ("body" in eventObj) {
body = eventObj.body;
if (eventObj.isBase64Encoded) {
body = Buffer.from(body, 'base64').toString('utf-8');
}
}
console.log(`receive http body: ${body}`);
return {
'statusCode': 200,
'body': body
};
}
Module CommonJS
Cet exemple de code prend en charge le déploiement en un clic. Vous pouvez déployer ce code dans Function Compute (FC) en un seul clic.start-fc3-nodejs-http
'use strict';
exports.handler = (event, context, callback) => {
const eventObj = JSON.parse(event);
console.log(`receive event: ${JSON.stringify(eventObj)}`);
let body = 'Hello World!';
// get http request body
if ("body" in eventObj) {
body = eventObj.body;
if (eventObj.isBase64Encoded) {
body = Buffer.from(body, 'base64').toString('utf-8');
}
}
console.log(`receive http body: ${body}`);
callback(null, {
'statusCode': 200,
'body': body
});
}
Prérequis
Une fonction utilisant le runtime Node.js et un déclencheur HTTP ont été créés conformément aux exemples précédents. Pour plus d'informations, consultez Créer une fonction déclenchée par événement et Configurer un déclencheur HTTP. Si vous souhaitez spécifier le code comme module ES, sélectionnez Node.js 18 ou Node.js 20 pour le runtime lors de la création de la fonction.
Procédure
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
Sur la page de détails de la fonction, cliquez sur l'onglet Triggers. Sur la page Triggers, récupérez l'endpoint public du déclencheur HTTP.
-
Exécutez la commande suivante dans un outil curl pour appeler la fonction.
curl -i "https://test-nodejs-dlgxxr****.cn-shanghai.fcapp.run" -d 'Hello World!'Dans la commande précédente,
https://test-nodejs-dlgxxr****.cn-shanghai.fcapp.runreprésente l'endpoint public du déclencheur HTTP.La réponse suivante est retournée.
HTTP/1.1 200 OK Access-Control-Expose-Headers: Date,x-fc-request-id Content-Disposition: attachment Content-Length: 12 Content-Type: text/html; charset=utf-8 Etag: W/"c-Lve95gjOVATpfV8EL5X4nxwjKHE" X-Fc-Request-Id: 1-65d866a8-15d8796a-cb9b4feb69ca X-Powered-By: Express Date: Fri, 23 Feb 2024 09:34:34 GMT Hello World!
Exemple 5 : Utiliser un déclencheur HTTP pour télécharger un fichier
Exemple de code
Pour retourner une image, un package compressé ou un fichier binaire depuis votre code, utilisez un déclencheur HTTP. Le code suivant en fournit un exemple.
Module ES
Cet exemple fonctionne uniquement avec les runtimes Node.js 18 ou ultérieurs.
// index.mjs
'use strict';
import mime from 'mime';
import fs from 'fs/promises';
import path from 'path';
export const handler = async (event, context) => {
const fileContent = 'This is a sample text file created in the code.';
const fileName = 'sample.txt';
const filePath = path.join('/tmp', fileName);
try {
await fs.writeFile(filePath, fileContent);
const mimeType = mime.getType(filePath);
if (!mimeType) {
throw new Error('Unable to determine MIME type');
}
const fileData = await fs.readFile(filePath);
const fileBase64 = Buffer.from(fileData).toString('base64');
const fcResponse = {
'statusCode': 200,
'headers': {
'Content-Type': mimeType,
'Content-Disposition': `attachment; filename="${fileName}"`,
},
'body': fileBase64,
'isBase64Encoded': true
};
console.log('File generated and fetched successfully.');
return fcResponse;
} catch (err) {
console.error(err);
return {
'statusCode': 500,
'body': err.message
};
}
};
Module CommonJS
// index.js
'use strict';
const mime = require('mime');
const fs = require('fs');
const path = require('path');
exports.handler = async (event, context, callback) => {
const fileContent = 'This is a sample text file created in the code.';
const fileName = 'sample.txt';
const filePath = path.join('/tmp', fileName);
try {
fs.writeFileSync(filePath, fileContent);
const mimeType = mime.getType(filePath);
if (!mimeType) {
throw new Error('Unable to determine MIME type');
}
const fileData = fs.readFileSync(filePath);
const fileBase64 = Buffer.from(fileData).toString('base64');
const fcResponse = {
'statusCode': 200,
'headers': {
'Content-Type': mimeType,
'Content-Disposition': `attachment; filename="${fileName}"`,
},
'body': fileBase64,
'isBase64Encoded': true
};
console.log('File generated and fetched successfully.');
callback(null, fcResponse);
} catch (err) {
console.error(err);
callback(null, {
'statusCode': 500,
'body': err.message
});
}
};
Prérequis
Créez une fonction utilisant le runtime Node.js ainsi qu'un déclencheur HTTP conformément aux exemples précédents. Pour plus d'informations, consultez Créer une fonction déclenchée par événement et Configurer un déclencheur HTTP. Si vous souhaitez spécifier le code comme module ES, définissez le runtime sur Node.js 18 ou Node.js 20 lors de la création de la fonction.
Procédure
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
Sur la page de détails de la fonction, cliquez sur l'onglet Code, puis choisissez pour ouvrir une fenêtre de terminal. Exécutez la commande
npm install mime@2pour installer la bibliothèque mime. Une fois l'installation terminée, cliquez sur Deploy.-
Sous l'onglet Trigger de la fonction, récupérez l'Internet Endpoint du déclencheur HTTP. Copiez l'URL dans votre navigateur et appuyez sur Entrée.
Cette action déclenche la fonction. Si l'exécution réussit, le fichier sera téléchargé sur votre machine locale.