Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Eine benutzerdefinierte JavaScript-Funktion (UDF) ist eine Art von Single Message Transform (SMT). UDFs bieten eine flexible Möglichkeit, benutzerdefinierte Transformationslogik in Pub/Sub zu implementieren, ähnlich wie BigQuery-JavaScript-UDFs.
UDFs akzeptieren eine einzelne Nachricht als Eingabe, führen die definierten Aktionen für die Eingabe aus und geben das Ergebnis des Prozesses zurück.
UDFs haben die folgenden wichtigen Eigenschaften:
Funktionsname:Der Name der JavaScript-Funktion im bereitgestellten Code, die Pub/Sub auf Nachrichten anwendet.
Code:Der JavaScript-Code, der die Transformationslogik definiert.
Dieser Code muss eine Funktion mit der folgenden Signatur enthalten:
/*** 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`}
Eingaben
message-Argument:Ein JavaScript-Objekt, das die Pub/Sub-Nachricht darstellt. Sie enthält die folgenden Attribute:
data: (String, erforderlich) Die Nachrichtennutzlast.
attributes: (Object<String, String>, optional) Eine Map mit Schlüssel-Wert-Paaren, die Nachrichtenattribute darstellen.
metadata-Argument:Ein JavaScript-Objekt mit unveränderlichen Metadaten zur Pub/Sub-Nachricht:
message_id: (String, optional) Die eindeutige ID der Nachricht.
publish_time: (String, optional) Die Veröffentlichungszeit der Nachricht im RFC 3339-Format (JJJJ-MM-TTTHH:mm:ssZ).
ordering_key: (String, optional) Der Sortierschlüssel der Nachricht, falls zutreffend.
Ausgaben
Wenn Sie eine Nachricht transformieren möchten, bearbeiten Sie den Inhalt von message.data und message.attributes und geben Sie das geänderte message-Objekt zurück.
Wenn Sie eine Nachricht filtern möchten, geben Sie null zurück.
Wie UDFs eine Nachricht transformieren
Das Ergebnis der Ausführung einer UDF für eine Nachricht kann eines der folgenden sein:
Die UDF transformiert eine Nachricht.
Die UDF gibt null zurück.
SMTs für Themen: Pub/Sub gibt „success“ an den Publisher zurück und enthält eine Nachrichten-ID in der Antwort für die gefilterten Nachrichten.
Pub/Sub speichert die Nachricht nicht und sendet sie nicht an Abonnenten.
SMTs für Abos: Pub/Sub bestätigt die Zustellung der Nachricht, ohne sie an einen Abonnenten zu senden.
Die UDF gibt einen Fehler aus.
Themen-SMTs: Pub/Sub gibt den Fehler an den Publisher zurück und veröffentlicht keine der Nachrichten.
SMTs für Abos: Pub/Sub bestätigt die Nachricht negativ.
Beschränkungen
In Pub/Sub werden Ressourcenlimits für UDFs erzwungen, um effiziente Transformationsvorgänge zu gewährleisten. Dazu gehören:
Hier sind einige Beispiel-UDFs für die Veröffentlichung und das Abonnieren.
Funktion: Konvertiert eine Ganzzahl für einen Wochentag in den entsprechenden String.
Wenn Sie die folgende UDF einem Thema oder Abo hinzufügen, werden beim Veröffentlichen oder Zustellen von Nachrichten die folgenden Änderungen vorgenommen:
Pub/Sub wendet die Funktion auf die Nachricht an. Wenn die Nachricht keine JSON-Nutzlast hat, gibt die UDF einen Fehler aus.
Die benutzerdefinierte Funktion sucht nach einem Feld namens dayOfWeek. Wenn der Wert dieses Felds eine Zahl zwischen 0 und 6 ist, wird er in den entsprechenden Wochentag wie Monday konvertiert. Wenn das Feld nicht vorhanden ist oder die Zahl nicht im Bereich von 0 bis 6 liegt, wird das Feld dayOfWeek im Code auf Unknown gesetzt.
Die UDF serialisiert die geänderte Nutzlast zurück in die Nachricht.
Pub/Sub übergibt die aktualisierte Nachricht an den nächsten Schritt in Ihrer Pipeline.
Wenn Sie die folgende UDF einem Thema oder Abo hinzufügen, werden beim Veröffentlichen oder Zustellen von Nachrichten die folgenden Änderungen vorgenommen:
Pub/Sub wendet die Funktion auf die Nachricht an. Wenn die Nachricht keine JSON-Nutzlast hat, gibt die UDF einen Fehler aus.
Mit der benutzerdefinierten Funktion wird das Feld ssn aus der Nutzlast der Nachricht entfernt (falls es vorhanden ist).
Die UDF serialisiert die geänderte Nutzlast zurück in die Nachricht.
Pub/Sub übergibt die aktualisierte Nachricht an den nächsten Schritt in Ihrer Pipeline.
Funktion: Bestimmte Nachrichten herausfiltern und automatisch bestätigen
Wenn Sie die folgende UDF einem Thema oder Abo hinzufügen, werden beim Veröffentlichen oder Zustellen von Nachrichten die folgenden Änderungen vorgenommen:
Pub/Sub wendet die Funktion auf die Nachricht an. Wenn die Nachricht keine JSON-Nutzlast hat, gibt die UDF einen Fehler aus.
Die benutzerdefinierte Funktion prüft, ob die Nutzlast ein Feld namens region enthält.
Wenn der Wert des Felds region nicht US ist, gibt die Funktion „null“ zurück. Dadurch wird die Nachricht von Pub/Sub gefiltert.
Wenn der Wert des Felds regionUS ist, übergibt Pub/Sub die ursprüngliche Nachricht an den nächsten Schritt in Ihrer Pipeline.
Funktion: Nachrichteninhalte validieren, um sicherzustellen, dass der Betrag nicht größer als 100 ist
Wenn Sie die folgende UDF einem Thema oder Abo hinzufügen, werden beim Veröffentlichen oder Zustellen von Nachrichten die folgenden Änderungen vorgenommen:
Pub/Sub wendet die Funktion auf die Nachricht an. Wenn die Nachricht keine JSON-Nutzlast hat, gibt die UDF einen Fehler aus.
Die UDF prüft, ob die Nachricht ein Feld namens amount enthält.
Wenn der Wert des Felds amount größer als 100 ist, gibt die Funktion einen Fehler aus.
Wenn der Wert des Felds amount nicht größer als 100 ist, gibt die Funktion die ursprüngliche Nachricht zurück.
Pub/Sub markiert die Nachricht dann entweder als fehlgeschlagen oder übergibt die Originalnachricht an den nächsten Schritt in Ihrer Pipeline.
functionvalidateAmount(message,metadata){constdata=JSON.parse(message.data);if(data["amount"] > 100){thrownewError("Amount is invalid");}returnmessage;}
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Schwer verständlich","hardToUnderstand","thumb-down"],["Informationen oder Beispielcode falsch","incorrectInformationOrSampleCode","thumb-down"],["Benötigte Informationen/Beispiele nicht gefunden","missingTheInformationSamplesINeed","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-08-17 (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)"]]