Descripción general de las funciones definidas por el usuario (UDF)
Organízate con las colecciones
Guarda y clasifica el contenido según tus preferencias.
Una función definida por el usuario (UDF) de JavaScript es un tipo de transformación de mensaje único (SMT). Las UDFs proporcionan una forma flexible de implementar lógica de transformación personalizada en Pub/Sub, de forma similar a las UDFs de JavaScript de BigQuery.
Las FDU aceptan un solo mensaje como entrada, realizan las acciones definidas en la entrada y devuelven el resultado del proceso.
Las funciones definidas por el usuario tienen las siguientes propiedades clave:
Nombre de la función: nombre de la función de JavaScript del código proporcionado que Pub/Sub aplica a los mensajes.
Código: el código de JavaScript que define la lógica de transformación.
Este código debe contener una función con la siguiente 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`}
Entradas
Argumento message: objeto JavaScript que representa el mensaje de Pub/Sub. Contiene las siguientes propiedades:
data: (String, obligatorio) Carga útil del mensaje.
attributes: (Object<String, String>, opcional) mapa de pares clave-valor que representa los atributos del mensaje.
Argumento metadata: objeto JavaScript que contiene metadatos inmutables sobre el mensaje de Pub/Sub:
message_id: (String, opcional) ID único del mensaje.
publish_time: (String, opcional) Hora de publicación del mensaje en formato RFC 3339 (AAAA-MM-DDTHH:mm:ssZ).
ordering_key: (String, opcional) La clave de ordenación del mensaje, si procede.
Resultados
Para transformar un mensaje, edita el contenido de message.data y message.attributes, y devuelve el objeto message modificado.
Para filtrar un mensaje, devuelve null.
Cómo transforman los UDFs un mensaje
El resultado de ejecutar una UDF en un mensaje puede ser uno de los siguientes:
La UDF transforma un mensaje.
La FDU devuelve null.
SMTs de temas: Pub/Sub devuelve un mensaje de éxito al editor e incluye un ID de mensaje en la respuesta de los mensajes filtrados.
Pub/Sub no almacena el mensaje ni lo envía a ningún suscriptor.
SMTs de suscripción: Pub/Sub confirma la entrega del mensaje sin enviarlo a un suscriptor.
La FDU genera un error.
SMTs de temas: Pub/Sub devuelve el error al editor y no publica ninguno de los mensajes.
SMTs de suscripción: Pub/Sub confirma negativamente el mensaje.
Limitaciones
Pub/Sub aplica límites de recursos a las UDFs para asegurar que las operaciones de transformación sean eficientes. Entre las limitaciones se incluyen las siguientes:
Un máximo de 20 KB de código por función definida por el usuario
Un tiempo de ejecución máximo de 500 ms por mensaje
Función: convierte un número entero de un día de la semana en la cadena correspondiente.
Cuando añades la siguiente función definida por el usuario a un tema o una suscripción, se producen los siguientes cambios durante la publicación o la entrega de mensajes:
Pub/Sub aplica la función al mensaje. Si el mensaje no tiene una carga útil JSON, la función definida por el usuario genera un error.
La función definida por el usuario busca un campo llamado dayOfWeek y, si el valor de este campo es un número entre 0 y 6, lo convierte en el día de la semana correspondiente, como Monday. Si el campo no existe o el número no está entre 0 y 6, el código asigna el valor Unknown al campo dayOfWeek.
La UDF serializa la carga útil modificada de nuevo en el mensaje.
Pub/Sub envía el mensaje actualizado al siguiente paso de tu
pipeline.
Función: ocultar un número de identificación personal
Cuando añades la siguiente función definida por el usuario a un tema o una suscripción, se producen los siguientes cambios durante la publicación o la entrega de mensajes:
Pub/Sub aplica la función al mensaje. Si el mensaje no tiene una carga útil JSON, la función definida por el usuario genera un error.
La función definida por el usuario elimina el campo ssn de la carga útil del mensaje (si existe).
La UDF serializa la carga útil modificada de nuevo en el mensaje.
Pub/Sub envía el mensaje actualizado al siguiente paso de tu
pipeline.
Función: filtrar y confirmar automáticamente mensajes específicos
Cuando añades la siguiente función definida por el usuario a un tema o una suscripción, se producen los siguientes cambios durante la publicación o la entrega de mensajes:
Pub/Sub aplica la función al mensaje. Si el mensaje no tiene una carga útil JSON, la función definida por el usuario genera un error.
La función definida por el usuario comprueba si la carga útil contiene un campo llamado region.
Si el valor del campo region no es US, la función devuelve null, lo que provoca que Pub/Sub filtre el mensaje.
Si el valor del campo region es US, Pub/Sub pasa el mensaje original al siguiente paso de tu canalización.
Función: valida el contenido del mensaje para asegurarse de que el importe no sea superior a 100
Cuando añades la siguiente función definida por el usuario a un tema o una suscripción, se producen los siguientes cambios durante la publicación o la entrega de mensajes:
Pub/Sub aplica la función al mensaje. Si el mensaje no tiene una carga útil JSON, la función definida por el usuario genera un error.
La función definida por el usuario comprueba si el mensaje contiene un campo llamado amount.
Si el valor del campo amount es mayor que 100, la función genera un error.
Si el valor del campo amount no es superior a 100, la función devuelve el mensaje original.
A continuación, Pub/Sub marca el mensaje como fallido o
pasa el mensaje original al siguiente paso de tu canalización.
functionvalidateAmount(message,metadata){constdata=JSON.parse(message.data);if(data["amount"] > 100){thrownewError("Amount is invalid");}returnmessage;}
[[["Es fácil de entender","easyToUnderstand","thumb-up"],["Me ofreció una solución al problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Es difícil de entender","hardToUnderstand","thumb-down"],["La información o el código de muestra no son correctos","incorrectInformationOrSampleCode","thumb-down"],["Me faltan las muestras o la información que necesito","missingTheInformationSamplesINeed","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-09-11 (UTC)."],[],[],null,["A 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\nInputs\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\nOutputs\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\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\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\nHere are some sample UDFs for publishing and subscribing. You can find\nadditional samples in the\n[UDF library](https://github.com/GoogleCloudPlatform/pubsub/tree/master/udfs).\n\nFunction: 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\nFunction: 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\nFunction: 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\nFunction: 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- [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)\n\n- Explore additional samples in the\n [UDF library](https://github.com/GoogleCloudPlatform/pubsub/tree/master/udfs)"]]