Informações gerais sobre as funções definidas pelo usuário (UDFs)
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Uma função definida pelo usuário (UDF) do JavaScript é um tipo de transformação de mensagem única (SMT, na sigla em inglês). As UDFs oferecem uma maneira flexível de implementar lógica de transformação personalizada no Pub/Sub, semelhante às UDFs JavaScript do BigQuery.
As UDFs aceitam uma única mensagem como entrada, realizam as ações definidas na entrada e retornam o resultado do processo.
As UDFs têm as seguintes propriedades principais:
Nome da função:o nome da função JavaScript no
código fornecido que o Pub/Sub aplica às mensagens.
Código:o código JavaScript que define a lógica de transformação.
Esse código precisa conter uma função com a seguinte assinatura:
/*** 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:um objeto JavaScript que representa a mensagem do Pub/Sub. Ele contém as seguintes propriedades:
data: (String, obrigatório) O payload da mensagem.
attributes: (Object<String, String>, opcional) um mapa de pares de chave-valor que representam atributos de mensagem.
Argumento metadata:um objeto JavaScript que contém metadados imutáveis sobre a mensagem do Pub/Sub:
message_id: (String, opcional) O ID exclusivo da mensagem.
publish_time: (String, opcional) o horário de publicação da mensagem no formato RFC 3339 (AAAA-MM-DDTHH:mm:ssZ).
ordering_key: (String, opcional) a chave de ordenação da mensagem, se aplicável.
Saídas
Para transformar uma mensagem, edite o conteúdo de message.data e message.attributes e retorne o objeto message alterado.
Para filtrar uma mensagem, retorne null.
Como as UDFs transformam uma mensagem
O resultado da execução de uma UDF em uma mensagem pode ser um dos seguintes:
A UDF transforma uma mensagem.
A UDF retorna null.
SMTs de tópico: o Pub/Sub retorna sucesso ao editor e
inclui um ID de mensagem na resposta para as mensagens filtradas.
O Pub/Sub não armazena nem envia a mensagem para nenhum assinante.
SMTs de assinatura: o Pub/Sub confirma a entrega da mensagem
sem enviá-la a um assinante.
A UDF gera um erro.
SMTs de tópico: o Pub/Sub retorna o erro ao editor e não publica nenhuma das mensagens.
SMTs de assinatura: o Pub/Sub envia uma confirmação negativa da mensagem.
Limitações
O Pub/Sub aplica limites de recursos às UDFs para garantir operações de transformação eficientes. As limitações incluem:
Confira alguns exemplos de UDFs para publicação e inscrição.
Função: converte um número inteiro de um dia da semana na string correspondente.
Quando você adiciona a UDF a seguir a um tópico ou uma assinatura, as seguintes mudanças ocorrem durante a publicação ou entrega da mensagem:
O Pub/Sub aplica a função à mensagem. Se a mensagem não tiver um payload JSON, a UDF vai gerar um erro.
A UDF procura um campo chamado dayOfWeek e, se o valor desse campo for um número entre 0 e 6, o converte em um dia da semana correspondente, como Monday. Se o campo não existir ou o número não estiver no intervalo de 0 a 6, o código vai definir o campo dayOfWeek como Unknown.
A UDF serializa o payload modificado de volta na mensagem.
O Pub/Sub transmite a mensagem atualizada para a próxima etapa do seu
pipeline.
Função: valida o conteúdo da mensagem para garantir que o valor não seja maior que 100
Quando você adiciona a UDF a seguir a um tópico ou uma assinatura, as seguintes mudanças ocorrem durante a publicação ou entrega da mensagem:
O Pub/Sub aplica a função à mensagem. Se a mensagem não tiver um payload JSON, a UDF vai gerar um erro.
A UDF verifica se a mensagem contém um campo chamado amount.
Se o valor do campo amount for maior que 100, a função vai gerar um erro.
Se o valor do campo amount não for maior que 100, a função vai retornar a mensagem original.
Em seguida, o Pub/Sub marca a mensagem como falha ou
transmite a mensagem original para a próxima etapa do pipeline.
functionvalidateAmount(message,metadata){constdata=JSON.parse(message.data);if(data["amount"] > 100){thrownewError("Amount is invalid");}returnmessage;}
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Informações incorretas ou exemplo de código","incorrectInformationOrSampleCode","thumb-down"],["Não contém as informações/amostras de que eu preciso","missingTheInformationSamplesINeed","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-09-04 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)"]]