Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Una funzione definita dall'utente (UDF) JavaScript è un tipo di trasformazione di un singolo messaggio (SMT). Le UDF forniscono un modo flessibile per implementare la logica di trasformazione personalizzata in Pub/Sub, in modo simile alle UDF JavaScript di BigQuery.
Le funzioni definite dall'utente accettano un singolo messaggio come input, eseguono le azioni definite sull'input e restituiscono il risultato del processo.
Le UDF hanno le seguenti proprietà chiave:
Nome funzione:il nome della funzione JavaScript all'interno del
codice fornito che Pub/Sub applica ai messaggi.
Codice:il codice JavaScript che definisce la logica di trasformazione.
Questo codice deve contenere una funzione con la seguente firma:
/*** Transforms a Pub/Sub message.* @return {(Object<string, (string | Object<string, string>)>|* null)} - To* filter a message, return `null`. To transform a message, return a map with* the following keys:* - (required) 'data' : {string}* - (optional) 'attributes' : {Object<string, string>}* Returning empty `attributes` will remove all attributes from the message.** @param {(Object<string, (string | Object<string, string>)>} - Pub/Sub* message. Keys:* - (required) 'data' : {string}* - (required) 'attributes' : {Object<string, string>}** @param {Object<string, any>} metadata - Pub/Sub message metadata.* Keys:* - (optional) 'message_id' : {string}* - (optional) 'publish_time': {string} YYYY-MM-DDTHH:MM:SSZ format* - (optional) 'ordering_key': {string}*/function<function_name>(message,metadata){// Perform custom transformation logicreturnmessage;// to filter a message instead, return `null`}
Input
Argomento message: un oggetto JavaScript che rappresenta il
messaggio Pub/Sub. Contiene le seguenti proprietà:
data: (String, obbligatorio) Il payload del messaggio.
attributes: (Object<String, String>, facoltativo) una mappa di coppie chiave-valore che rappresentano gli attributi del messaggio.
Argomento metadata: un oggetto JavaScript contenente metadati immutabili
sul messaggio Pub/Sub:
message_id: (String, facoltativo) L'ID univoco del messaggio.
publish_time: (String, facoltativo) L'ora di pubblicazione del messaggio nel formato
RFC 3339 (AAAA-MM-GGTHH:mm:ssZ).
ordering_key: (String, facoltativo) La chiave di ordinamento del messaggio,
se applicabile.
Output
Per trasformare un messaggio, modifica i contenuti di message.data e
message.attributes e restituisci l'oggetto message modificato.
Per filtrare un messaggio, restituisci null.
In che modo le UDF trasformano un messaggio
Il risultato dell'esecuzione di una UDF su un messaggio può essere uno dei seguenti:
La funzione definita dall'utente trasforma un messaggio.
La funzione definita dall'utente restituisce null.
SMT dell'argomento: Pub/Sub restituisce l'esito positivo al publisher e
include un ID messaggio nella risposta per i messaggi filtrati.
Pub/Sub non archivia il messaggio né lo invia ad alcun sottoscrittore.
SMT di sottoscrizione: Pub/Sub conferma la consegna del messaggio
senza inviarlo a un sottoscrittore.
La funzione definita dall'utente genera un errore.
SMT dell'argomento: Pub/Sub restituisce l'errore al publisher e non pubblica nessuno dei messaggi.
SMT di sottoscrizione: Pub/Sub riconosce negativamente il messaggio.
Limitazioni
Pub/Sub applica limiti di risorse alle UDF per garantire operazioni di trasformazione efficienti. Le limitazioni includono:
Un massimo di 20 kB di codice per UDF
Un massimo di 500 ms di tempo di esecuzione per messaggio
Ecco alcune UDF di esempio per la pubblicazione e la sottoscrizione.
Funzione: converte un numero intero che rappresenta un giorno della settimana nella stringa corrispondente
Quando aggiungi la seguente UDF a un argomento o a un abbonamento,
durante la pubblicazione o la distribuzione del messaggio vengono apportate le seguenti modifiche:
Pub/Sub applica la funzione al messaggio. Se il messaggio non ha un payload JSON, la UDF genera un errore.
La funzione definita dall'utente cerca un campo denominato dayOfWeek e, se il valore di questo campo
è un numero compreso tra 0 e 6, lo converte nel giorno della settimana corrispondente, ad esempio
Monday. Se il campo non esiste o il numero non rientra nell'intervallo da 0 a 6, il codice imposta il campo dayOfWeek su Unknown.
La UDF serializza il payload modificato nel messaggio.
Pub/Sub passa il messaggio aggiornato al passaggio successivo della pipeline.
Quando aggiungi la seguente UDF a un argomento o a un abbonamento,
durante la pubblicazione o la distribuzione del messaggio vengono apportate le seguenti modifiche:
Pub/Sub applica la funzione al messaggio. Se il messaggio
non ha un payload JSON, la UDF genera un errore.
La funzione definita dall'utente rimuove il campo ssn dal payload del messaggio (se esiste).
La UDF serializza il payload modificato nel messaggio.
Pub/Sub passa il messaggio aggiornato al passaggio successivo della pipeline.
Funzione: filtrare e confermare automaticamente la ricezione di messaggi specifici
Quando aggiungi la seguente UDF a un argomento o a un abbonamento,
durante la pubblicazione o la distribuzione del messaggio vengono apportate le seguenti modifiche:
Pub/Sub applica la funzione al messaggio. Se il messaggio non ha un payload JSON, la UDF genera un errore.
La funzione definita dall'utente controlla se il payload contiene un campo denominato region.
Se il valore del campo region non è US, la funzione restituisce
null, facendo in modo che Pub/Sub filtri il messaggio.
Se il valore del campo region è US, Pub/Sub passa il
messaggio originale al passaggio successivo della pipeline.
Funzione: valida il contenuto del messaggio per assicurarsi che l'importo non sia superiore a 100
Quando aggiungi la seguente UDF a un argomento o a un abbonamento,
durante la pubblicazione o la distribuzione del messaggio vengono apportate le seguenti modifiche:
Pub/Sub applica la funzione al messaggio. Se il messaggio non ha un payload JSON, la UDF genera un errore.
La funzione definita dall'utente controlla se il messaggio contiene un campo denominato amount.
Se il valore del campo amount è maggiore di 100, la funzione
genera un errore.
Se il valore del campo amount non è maggiore di 100, la
funzione restituisce il messaggio originale.
Pub/Sub contrassegna il messaggio come non riuscito oppure
lo passa al passaggio successivo della pipeline.
functionvalidateAmount(message,metadata){constdata=JSON.parse(message.data);if(data["amount"] > 100){thrownewError("Amount is invalid");}returnmessage;}
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Difficile da capire","hardToUnderstand","thumb-down"],["Informazioni o codice di esempio errati","incorrectInformationOrSampleCode","thumb-down"],["Mancano le informazioni o gli esempi di cui ho bisogno","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-09-04 UTC."],[],[],null,["# User Defined Functions (UDFs) overview\n\nA JavaScript **User-Defined Function (UDF)** is a type of Single Message\nTransform (SMT). UDFs provide a flexible way to implement custom transformation\nlogic within Pub/Sub, similar to\n[BigQuery JavaScript UDFs](/bigquery/docs/user-defined-functions).\n\nUDFs accept a single message as input, perform the defined\nactions on the input, and return the result of the process.\n\nUDFs have the following key properties:\n\n- **Function name:** The name of the JavaScript function within the\n provided code that Pub/Sub applies to messages.\n\n- **Code:** The JavaScript code that defines the transformation logic.\n This code must contain a function with the following signature:\n\n /**\n * Transforms a Pub/Sub message.\n * @return {(Object\u003cstring, (string | Object\u003cstring, string\u003e)\u003e|* null)} - To\n * filter a message, return `null`. To transform a message, return a map with\n * the following keys:\n * - (required) 'data' : {string}\n * - (optional) 'attributes' : {Object\u003cstring, string\u003e}\n * Returning empty `attributes` will remove all attributes from the message.\n *\n * @param {(Object\u003cstring, (string | Object\u003cstring, string\u003e)\u003e} - Pub/Sub\n * message. Keys:\n * - (required) 'data' : {string}\n * - (required) 'attributes' : {Object\u003cstring, string\u003e}\n *\n * @param {Object\u003cstring, any\u003e} metadata - Pub/Sub message metadata.\n * Keys:\n * - (optional) 'message_id' : {string}\n * - (optional) 'publish_time': {string} YYYY-MM-DDTHH:MM:SSZ format\n * - (optional) 'ordering_key': {string}\n */\n function \u003cfunction_name\u003e(message, metadata) {\n // Perform custom transformation logic\n return message; // to filter a message instead, return `null`\n }\n\n### Inputs\n\n- **`message` argument:** A JavaScript object representing the\n Pub/Sub message. It contains the following properties:\n\n - `data`: (`String`, required) The message payload.\n\n - `attributes`: (`Object\u003cString, String\u003e`, optional) A map of key-value\n pairs representing message attributes.\n\n- **`metadata` argument:** A JavaScript object containing immutable metadata\n about the Pub/Sub message:\n\n - `message_id`: (`String`, optional) The unique ID of the message.\n\n - `publish_time`: (`String`, optional) The message's publish time in\n [RFC 3339](https://www.rfc-editor.org/rfc/rfc3339) format (YYYY-MM-DDTHH:mm:ssZ).\n\n - `ordering_key`: (`String`, optional) The message's [ordering key](/pubsub/docs/ordering),\n if applicable.\n\n### Outputs\n\n- To transform a message, edit the contents of `message.data` and\n `message.attributes`, and return the altered `message` object.\n\n- To filter a message, return `null`.\n\nHow UDFs transform a message\n----------------------------\n\nThe result of running a UDF on a message can be one of the following:\n\n- The UDF transforms a message.\n\n- The UDF returns `null`.\n\n - Topic SMTs: Pub/Sub returns success to the publisher and\n includes a message ID in the response for the filtered messages.\n Pub/Sub does not store the message or send it to any subscribers.\n\n - Subscription SMTs: Pub/Sub acknowledges the message delivery\n without sending the message to a subscriber.\n\n- The UDF throws an error.\n\n - Topic SMTs: Pub/Sub returns the error to the publisher and\n does not publish any of the messages.\n\n - Subscription SMTs: Pub/Sub negatively acknowledges the message.\n\nLimitations\n-----------\n\nPub/Sub enforces resource limits on UDFs to ensure efficient\ntransformation operations. The limitations include:\n\n- A maximum of 20 KB of code per UDF\n- A maximum of 500 ms of execution time per message\n- Support for only [ECMAScript standard built-ins](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)\n- No calls to external APIs\n- No imports of external libraries\n\nSample UDFs\n-----------\n\nHere are some sample UDFs for publishing and subscribing.\n\n### Function: Convert a day of the week integer to the corresponding string\n\nWhen you add the following UDF to a topic or a subscription,\nthe following changes take place during message publish or delivery:\n\n1. Pub/Sub applies the function to the message. If the message does\n not have a JSON payload, the UDF throws an error.\n\n2. The UDF looks for a field called `dayOfWeek` and if the value of this field\n is a number between 0 and 6, converts it to a corresponding day of the week such\n as `Monday`. If the field does not exist or the number is not in the range of 0\n to 6, the code sets the `dayOfWeek` field to `Unknown`.\n\n3. The UDF serializes the modified payload back into the message.\n\n4. Pub/Sub passes the updated message to the next step in your\n pipeline.\n\n function intToString(message, metadata) {\n const data = JSON.parse(message.data);\n switch(`data[\"dayOfWeek\"]`) {\n case 0:\n data[\"dayOfWeek\"] = \"Sunday\";\n break;\n case 1:\n data[\"dayOfWeek\"] = \"Monday\";\n break;\n case 2:\n data[\"dayOfWeek\"] = \"Tuesday\";\n break;\n case 3:\n data[\"dayOfWeek\"] = \"Wednesday\";\n break;\n case 4:\n data[\"dayOfWeek\"] = \"Thursday\";\n break;\n case 5:\n data[\"dayOfWeek\"] = \"Friday\";\n break;\n case 6:\n data[\"dayOfWeek\"] = \"Saturday\";\n break;\n default:\n data[\"dayOfWeek\"] = \"Unknown\";\n }\n message.data = JSON.stringify(data);\n return message;\n }\n\n### Function: Redact a social security number\n\nWhen you add the following UDF to a topic or a subscription,\nthe following changes take place during message publish or delivery:\n\n1. Pub/Sub applies the function to the message. If the message\n does not have a JSON payload, the UDF throws an error.\n\n2. The UDF removes the field `ssn` from the message payload (if it exists).\n\n3. The UDF serializes the modified payload back into the message.\n\n4. Pub/Sub passes the updated message to the next step in your\n pipeline.\n\n function redactSSN(message, metadata) {\n const data = JSON.parse(message.data);\n delete data['ssn'];\n message.data = JSON.stringify(data);\n return message;\n }\n\n### Function: Filter out and auto-ack specific messages\n\nWhen you add the following UDF to a topic or a subscription,\nthe following changes take place during message publish or delivery:\n\n1. Pub/Sub applies the function to the message. If the message does\n not have a JSON payload, the UDF throws an error.\n\n2. The UDF checks if the payload contains a field called `region`.\n\n3. If the value of the `region` field is not `US`, the function returns\n null, causing Pub/Sub to filter the message.\n\n4. If the value of the `region` field is `US`, Pub/Sub passes the\n original message to the next step in your pipeline.\n\n function filterForUSRegion(message, metadata) {\n const data = JSON.parse(message.data);\n if (data[\"region\"] !== \"US\") {\n return null;\n }\n return message;\n }\n\n### Function: Validate message content to ensure the amount is not greater than 100\n\nWhen you add the following UDF to a topic or a subscription,\nthe following changes take place during message publish or delivery:\n\n1. Pub/Sub applies the function to the message. If the message does\n not have a JSON payload, the UDF throws an error.\n\n2. The UDF checks if the message contains a field called `amount`.\n\n3. If the value of the `amount` field is greater than `100`, the function\n throws an error.\n\n4. If the value of the `amount` field is not greater than `100`, the\n function returns the original message.\n\n5. Pub/Sub then either marks the message as failed, or\n passes the original message to the next step in your pipeline.\n\n function validateAmount(message, metadata) {\n const data = JSON.parse(message.data);\n if (data[\"amount\"] \u003e 100) {\n throw new Error(\"Amount is invalid\");\n }\n return message;\n }\n\nWhat's next\n-----------\n\n- [Choose between topic and subscription SMTs](/pubsub/docs/smts/choose-smts)\n\n- [Create a topic with SMTs](/pubsub/docs/smts/create-topic-smt)\n\n- [Create a subscription with SMTs](/pubsub/docs/smts/create-subscription-smt)"]]