JavaScript básico em caixas de código
| Família | Finalidade |
|---|---|
| JavaScript | Recursos da linguagem observados nos exemplos, como JSON, Date, condicionais, arrays e objetos. |
Antes de usar
- Os scripts são executados em um runtime JavaScript baseado em Nashorn/JVM.
- Esta página documenta apenas recursos observados nos scripts e exemplos existentes; não deve ser tratada como uma referência completa de JavaScript moderno.
- Para ações do fluxo, use as APIs da plataforma:
dialog.*,utils.*econtact.*. - Valide valores nulos e entradas externas antes de convertê-los ou acessá-los.
JSON
JSON.stringify(value)
Efeito: converte um objeto ou array JavaScript em uma string JSON. É útil para enviar payloads a integrações, sinais e comandos que recebem JSON serializado.
var payload = JSON.stringify({
nome: dialog.get('nome'),
protocolo: dialog.get('protocolo')
});
dialog.webhook(
{'Content-Type': 'application/json'},
'https://api.example.com/eventos',
'POST',
payload
);
JSON.parse(text)
Efeito: converte uma string JSON em objeto JavaScript para que seus campos possam ser lidos.
var resultado = JSON.parse(input.payload);
if (resultado.status == 'ok') {
dialog.go('node-sucesso');
}
Só use
JSON.parse(...)quando o conteúdo for realmente JSON válido. Um texto inválido interrompe a execução se não for tratado pelo fluxo.
Datas e números
Date.now()
Efeito: retorna o timestamp atual em milissegundos desde o epoch Unix.
var inicio = Date.now();
dialog.set('inicioProcessamento', inicio);
parseInt(value, radix)
Efeito: converte um valor textual em número inteiro. Use o radix 10 quando o valor for decimal.
var nota = parseInt(dialog.get('nota'), 10);
if (nota >= 9) {
dialog.go('node-promotor');
}
Verifique se o valor realmente contém um número antes de utilizá-lo em uma comparação.
Condicionais
if e else
Efeito: executam trechos diferentes de código de acordo com uma condição.
var status = dialog.get('status');
if (status == 'aprovado') {
dialog.go('node-aprovado');
} else {
dialog.go('node-reprovado');
}
else if
Efeito: permite testar várias condições em sequência.
var idade = parseInt(dialog.get('idade'), 10);
if (idade < 18) {
dialog.go('node-menor');
} else if (idade < 60) {
dialog.go('node-adulto');
} else {
dialog.go('node-idoso');
}
Operadores lógicos
Efeito: combinam ou negam condições:
&&— todas as condições precisam ser verdadeiras;||— pelo menos uma condição precisa ser verdadeira;!— nega uma condição.
var nome = dialog.get('nome');
var cpf = dialog.get('cpf');
if (nome != null && cpf != null) {
dialog.go('node-dados-completos');
} else {
dialog.go('node-solicitar-dados');
}
Arrays e objetos
Array literal: [valor1, valor2]
Efeito: cria uma lista de valores. Arrays são usados por comandos como dialog.setTags(...), dialog.sendInteractiveList(...) e utils.choose(...).
var opcoes = ['cancelar', 'consultar', 'falar com atendente'];
dialog.set('opcoesDisponiveis', opcoes);
Objeto literal: {chave: valor}
Efeito: cria uma estrutura de dados com propriedades nomeadas. Objetos são usados para atributos, payloads e variáveis compostas.
var cliente = {
nome: dialog.get('nome'),
email: dialog.get('email')
};
dialog.set('cliente', cliente);
Acesso a propriedade: objeto.propriedade
Efeito: lê uma propriedade de um objeto.
var status = resultado.status;
dialog.set('statusConsulta', status);
Acesso por chave: objeto['propriedade']
Efeito: lê uma propriedade usando uma chave textual. É útil quando o nome do campo está em uma variável ou quando a chave contém caracteres especiais.
var campo = 'numeroContrato';
var valor = cliente[campo];
dialog.set('contrato', valor);
Texto e composição de mensagens
Concatenação com +
Efeito: combina textos e valores em uma única string.
var nome = dialog.get('nome');
dialog.say('Olá, ' + nome + '!');
Conversão implícita em mensagem
Efeito: ao concatenar um número ou outro valor com texto, o JavaScript converte o valor para representação textual.
var protocolo = dialog.get('protocolo');
dialog.say('Seu protocolo é ' + protocolo + '.');
Para formatações específicas, prefira preparar o valor antes e validar se ele não é
null.
Validação defensiva
Comparação com null
Efeito: verifica se um valor existe antes de acessar propriedades ou enviá-lo ao usuário.
var contato = contact.get();
if (contato != null) {
dialog.say('Olá, ' + contato.name + '!');
} else {
dialog.go('node-cadastrar-contato');
}
Conversão depois da validação
Efeito: evita converter valores ausentes em números inválidos.
var notaTexto = dialog.get('nota');
if (notaTexto != null) {
var nota = parseInt(notaTexto, 10);
dialog.assess('avaliacao-nps', nota);
}
O que não está coberto por esta página
Esta página não documenta métodos avançados de JavaScript, APIs Java, acesso a arquivos, rede direta, reflexão ou bibliotecas externas. Nas caixas de código, utilize as APIs do Botengine e as funções listadas nas referências do projeto.
Convenções recomendadas para uso
Leitura e escrita de variáveis
A referência de contexto explicita dialog.get(...) como a forma documentada de leitura de variável de sessão e dialog.set(...) como forma documentada de gravação. variables.get(...) e variables.nomeDaVariavel aparecem em exemplos existentes; para novos scripts, mantenha uma convenção única no fluxo.
var cpf = dialog.get('cpf');
if (cpf != null) {
dialog.say('CPF recebido: ' + cpf);
}
Navegação
Use dialog.go(...) para navegação normal. dialog.redirect(...) é sinônimo, mas a fonte recomenda go() em novos scripts.
dialog.go('node-confirmacao');
Tratamento de dados externos
Quando um retorno externo vier em input.payload, valide e faça o parsing antes de acessar propriedades:
if (input.payload != null) {
var resultado = JSON.parse(input.payload);
dialog.set('statusConsulta', resultado.status);
}
HTTP: webhook x REST
dialog.webhook(...): dispara e segue sem aguardar resposta.dialog.rest(...): aguarda resposta e roteia por faixa de status.dialog.oauthRest(...): equivalente arest(...), com gestão transparente de OAuth2.
Assistentes IA: v1 x v2
A documentação recomenda dialog.sendToAssistantV2(...) para novos fluxos. dialog.sendToAssistant(...) pertence à integração legada v1. Não misture as duas APIs no mesmo fluxo, pois o estado não é compartilhado.
Sinais e espera
dialog.awaitSignal(...) pode suspender um fluxo indefinidamente se não houver timeout. A própria referência recomenda combinar a espera com dialog.createNamedTimeout(...).
Contatos
Use contact.get() quando o contato já estiver vinculado à sessão. Quando o fluxo pode precisar criar o contato, prefira contact.upsert(...) ou contact.upsertBy(...). Atenção especial a identificadores: customId não deve ser tratado como telefone normalizado e valores inconsistentes podem gerar duplicidade.
Segurança e segredos
A referência de utils.* informa que 3DES depende de uma chave configurada no ambiente. Não coloque chaves ou segredos diretamente na caixa de código.
Limites e pontos que exigem confirmação no ambiente
- O runtime é descrito como JavaScript baseado em Nashorn/JVM; a referência de JavaScript é deliberadamente parcial.
globalVariablesé disponibilizado pelo runtime, mas a fonte não documenta uma assinatura completa de leitura/escrita para ele. A operação explicitamente documentada édialog.updateGlobalVariable(...).- A disponibilidade de algumas propriedades de
sessionpode variar conforme canal e versão do runtime. findBy(...)documenta vários tipos de identificador; implementações mais recentes também registrambsuid, mas a própria fonte recomenda confirmar a versão do serviço antes do uso.dialog.createNamedTimeout(...)contém uma observação de nomenclatura: o parâmetrotargetNodeaparece comotargetNoneno código original e é tratado na documentação como o nó destino.- A análise de imagem por
dialog.imageAnalysis(...)exigemediaIdpreviamente produzido no fluxo; para URL pública, usedialog.imageAnalysisByUrl(...). dialog.sendSMS(...)exige mensagem não vazia e aceitaTransactionalouPromotional.dialog.checkPFCompleta(...)retornafalsesilenciosamente quandomediasJsoné JSON malformado.