Skip to main content

Pessoal estou com o seguinte problema. Estou utilizando o bucket para guardar o status de minha conversa, mas o comando get as vezes falha conforme imagem anexa. A falha até então é totalmente aleatória.



Adicionei também o trecho do index.js e do module utilizado para fazer essa gravação, agradeço se puderem me ajudar nesta questão.





***** index.js *****



/* Message Receiver para plain/text */


clientManager.client.addMessageReceiver(‘text/plain’, async function (message) {



const status = await statusController.getStatus(message.from, clientManager.client);



switch (status) {

case 0:

var msg = {

type: "text/plain",

content: "Mensagem 1",

to: message.from,

id: Lime.Guid()

};

clientManager.client.sendMessage(msg);

await statusController.setStatus(message.from, 1, clientManager.client);

break;



**** status-controller ****



let Lime = require(“lime-js”);



var status = 0;



async function setStatus(from, pstatus, client) {



await client.sendCommand({

'id': Lime.Guid(),

'method': 'set',

'uri': `/buckets/${from}?expiration=300000`,

'type': 'application/json',

'resource': {

'status': pstatus

}

}).then(function(res) {;

console.log(`${from} - Status setado: ` + pstatus);

})

.catch(function(err) {

console.log(`${from} - Erro ao setar status: ` + err);

});



}



async function getStatus(from, client) {



var status = 0;



await client.sendCommand({

'id': Lime.Guid(),

'method': 'get',

'uri': `/buckets/${from}`

}).then(function(resStatus) {

status = resStatus.resource.status;

console.log(`${from} - Status atual: ` + status);

})

.catch(function(err) {

status = 999;

console.log(`${from} -Erro ao recuperar status: ` + err);

});

return status;



}



module.exports.getStatus = getStatus;


module.exports.setStatus = setStatus;

Francisco, caso não exista nenhum document gravado para essa chave a promessa é negada.



Não é esse o caso?!?


Obrigado pelo retorno Breno. Fiz chamadas em sequência setando numa iteração e na outra somente consultando, usando o await para sincronizar, mas ainda de sim, de forma intermitente ocorre falha no get.



Ainda coloquei o expiration 30000 pra ver se era isso e ainda sim tive algumas chamadas com falha. De qualquer forma vou revisar minha implementação. Mais uma vez obrigado.


@Francisco_Freitas



O acesso é do BlipChat web?



Se for talvez o from venha da seguinte forma por exemplo ‘05574338-1234-34-b74b-b2c07dafce84_u.blip.ai/web’ e notei em algum lugar que se mandar com o /web junto não dá certo, tente fazer algo pra remover o /web pra ver se ajuda…



Se tiver usando JS talvez ajude



if (from.includes('/web')) {

from = from.replace('/web', '');

}



await client.sendCommand({

id: Lime.Guid(),

method: "get",

uri: `/buckets/${from}`

})

.then( async res => {



// res



}).catch(err => {

console.log(err);

});

Obrigado pela informação, mas estou usando o messenge do facebook. Testei aqui minha implelentação e o from é sempre o mesmo ainda assim o error ocorre. É preciso setar umas 4 ou 5 vezes e só depois disso é que o get começa a funcionar.



Acho que existe uma latência entre o set e o get. Talvez o commit ainda não tenha ocorrido mesmo após o set ter retornado sucesso.


Já tentou usar um setTimeout() com uns 2 segundos pra dar o tempo de gravar?





  1. Você grava


  2. SetTimeout 2 segundos


  3. Faz a consulta ao Bucket



Obrigado pelo retorno Odirlei, o problema [e quando a aplicacao escalar e os dois segundos na forem suficientes. Ajustei meu codigo, antes eu colocava a funcao num arquivo separado usando module.exports. Alterei a implementacao paraque aconsulta do status acontecesse no chamando na mesma funcao do receiver.



Na teoria chamando em module exports ou dentro da funcao deveria dar o mesmo resultado, mas em meus testes o comportamento varia.


Francisco, no final o comportamento continuou variando ou você encontrou uma forma de contornar o problema?


Tirei as functions do module.exports e deixei no index.js mesmo e parou de dar o erro.



Mas eu gostaria de modularizar melhor, depois qaundo for refatorar vou tentar modularizar novamente para ver se o comprotamento persiste.



Obrigado pelo retorno


Comente