Automações

Sandbox no servidor, API de context, valores de retorno, timeout e transformações customizadas.

Nó JavaScript

O nó JavaScript (js_code) executa JavaScript customizado no servidor dentro de uma VM em sandbox. Use quando variáveis de template e operadores de Condição não bastam — parse de respostas de API bagunçadas, agregados, moldagem de JSON ou regras de negócio em código.

Disponível em Lógica em Automações.

Workflows > editor > JavaScript node code editor Figura 1: Nó JavaScript com editor de código server-side

O que faz

O engine:

  1. Envolve seu código em uma IIFE async: (async function() { /* your code */ })().
  2. Executa em VM isolada com timeout de 10 segundos.
  3. Injeta um sandbox controlado (veja abaixo).
  4. Armazena o valor de retorno como saída do nó; se o retorno não for objeto com chave result, é encapsulado como { result: <value> }.
  5. Disponibiliza a saída em {{js_1.result}} e em context.nodes.

console.log / warn / error escrevem nos logs do servidor com prefixo [WF-JS] — útil para depuração, não retornado ao cliente.

Como configurar

Clique duas vezes no nó JavaScript e edite o campo Code.

API do sandbox

Globais disponíveis dentro do script:

NomeDescrição
contextContexto completo do workflow (trigger, variables, nodes, company, …)
inputSaída do nó imediatamente anterior (context.input)
triggerPayload do trigger — trigger.body, trigger.query, etc.
variablesMapa mutável de variáveis de execução — atribua variables.key = value para expor via {{variables.key}}
nodesMapa de saídas de nós anteriores por ID do nó
company{ id, members, … } quando hidratado
JSON, Date, Math, Array, Object, String, Number, Boolean, RegExp, Error, PromiseBuiltins padrão
parseInt, parseFloat, isNaN, isFinite, encodeURIComponent, decodeURIComponentUtilitários
consolelog, warn, error → logs do servidor

Não disponível (bloqueado): require, process, setTimeout, setInterval, filesystem, rede a partir de JS (use nós HTTP para APIs).

Valor de retorno

Use return com qualquer valor serializável em JSON:

const total = (input.data?.items || []).reduce((s, i) => s + i.price, 0);
return { total, currency: 'BRL', item_count: input.data.items.length };

Acesso downstream: {{js_1.result.total}}, {{js_1.result.item_count}}.

Retornos primitivos também funcionam:

return input.data.status === 'paid';
// → { result: true }

Código async

O wrapper é async — você pode usar cadeias await Promise dentro do sandbox apenas (sem HTTP externo a partir de JS).

const rows = await Promise.all(
  (input.data.ids || []).map(id => Promise.resolve({ id, ok: true }))
);
return { rows };

Dicas e boas práticas

  • Prefira nós declarativos primeiro. HTTP, Variável, Condição e Texto cobrem a maioria dos fluxos — JavaScript adiciona custo de manutenção.
  • Mantenha scripts curtos e puros. Input → transform → return. Efeitos colaterais devem ser sobretudo atribuições a variables que você documente.
  • Parse defensivo. APIs mudam; use optional chaining e defaults (input?.data?.items ?? []).
  • Não armazene secrets no código. Use globais do workflow ou integration keys para tokens.
  • Teste com NodeTestDialog. Passe JSON representativo de input; inspecione output.result antes de conectar a Send ou CRM.
  • Log com moderação. console.log ajuda na depuração mas enche logs em loops apertados — remova ou condicione antes de produção.
  • Evite loops pesados. Tempo máximo da VM é 10s; grandes volumes de dados devem ser reduzidos upstream (Loop + lotes menores).

Exemplos de uso

Exemplo 1 — Parse de body de webhook não padrão

Trigger: Webhook — ERP envia string aninhada form-encoded.

const raw = trigger.body?.payload || '';
let parsed;
try {
  parsed = JSON.parse(raw);
} catch {
  parsed = { error: 'invalid_json', raw };
}
variables.order_id = parsed.id;
return parsed;

Próximo: Condição em {{js_1.result.error}} is_empty.

Exemplo 2 — Calcular faixa de frete

const weight = Number(variables.total_weight || input.data.weight || 0);
const region = variables.ship_region || 'default';
let tier = 'standard';
if (weight > 30) tier = 'freight';
else if (weight > 10) tier = 'express';
if (region === 'remote') tier = 'freight';
variables.shipping_tier = tier;
return { tier, weight, region };

Próximo: HTTP da API de frete com {{variables.shipping_tier}}.

Exemplo 3 — Deduplicar lista de contatos antes do Loop

const list = input.data?.contacts || [];
const seen = new Set();
const unique = [];
for (const c of list) {
  const phone = String(c.phone || '').replace(/\D/g, '');
  if (!phone || seen.has(phone)) continue;
  seen.add(phone);
  unique.push({ ...c, phone });
}
return { contacts: unique, count: unique.length };

Próximo: Loop em {{js_1.result.contacts}}.

FAQ

JavaScript pode chamar APIs externas?

Não há rede direta a partir do sandbox. Use um nó HTTP antes ou depois do JavaScript.

Por que meu script deu timeout?

A execução excedeu 10 segundos. Reduza tamanho ou complexidade dos dados.

Por que a saída é { result: undefined }?

O script não fez return de valor. Adicione um return explícito.

Posso mutar trigger ou input?

Evite depender de mutações — retorne novos objetos e defina variables para uso downstream com templates.

npm / require é suportado?

Não. Apenas os globais do sandbox listados acima.

JavaScript roda em teste isolado do nó?

Sim. Forneça JSON mock de input / trigger no diálogo de teste conforme necessário.

Artigos relacionados

Este artigo foi útil?

Precisa de mais ajuda? Falar com suporte

Central de Ajuda