jQuery: lidando com respostas de erro do servidor interno
-
25-09-2019 - |
Pergunta
Eu tenho um formulário em uma página que adiciona novos dados a um banco de dados via jQuery. Funciona bem, mas às vezes o servidor se afasta e eu recebo um 500 (erro interno do servidor), mas isso é porque meu servidor é péssimo.
O problema é que às vezes recebo o erro do servidor após o PHP fazer a adição ao banco de dados, mas, em vez de receber uma mensagem de sucesso, recebo o erro, mesmo que a adição tenha sido feita. Então, como devo fazer isso para garantir que o PHP não adicione os dados se eu receber o erro?
E sim, eventualmente vou mudar para um novo servidor, mas nenhum servidor é perfeito
Aqui está o script:
$.ajax({
type: "POST",
url: "/clase/do-add",
data: $("#add").serialize(),
dataType: "json",
timeout: 8000,
beforeSend: function() {
var icon = '<p class="loading-add"></p>'; // loading icon
$('form#add').append(icon);
},
success: function(data) {
if (data.error == true) { // php returns error = true if name is invalid
alert('Invalid name.');
$('form#add').find('p').remove();
} else {
// make the addition
}
},
error: function () {
$('form#add').find('p').remove();
alert('Error. Try again.');
}
});
Solução
Você pode envolver você ajax chamada em uma função e "reqest" a função novamente no erro.
Algo Linke isto:
jQuery.fn = function yourajaxfunction(){
$.ajax({
type: "POST",
url: "/clase/do-add",
data: $("#add").serialize(),
dataType: "json",
timeout: 8000,
beforeSend: function() {
var icon = '<p class="loading-add"></p>'; // loading icon
$('form#add').append(icon);
},
success: function(data) {
if (data.error == true) { // php returns error = true if name is invalid
alert('Invalid name.');
$('form#add').find('p').remove();
} else {
// make the addition
}
},
error: function () {
$('form#add').find('p').remove();
// ####### i added this:
$(this).yourajaxfunction();
alert('Error. Try again.');
}
});
}
Ou você pode ter uma função ociosa que verifica novamente após alguns milissegundos antes de executar a função novamente no erro:
$(this).idle().yourajaxfunction();
Função ociosa usada acima:
jQuery.fn.idle = function(time){
var o = $(this);
o.queue(function(){
setTimeout(function(){
o.dequeue();
}, time);
});
return o;
};
Mas o melhor é corrigir o servidor. Esse material é apenas hacks e patches que compensam outro problema: o servidor ruim. :)
Portanto, não é uma boa ideia para quaisquer cenários de produção.
Outras dicas
Você pode criar um controle da inserção no banco de dados, se a adição de erro retornado.
...
error: function () {
var fError = function() {
$('form#add').find('p').remove();
alert('Error. Try again.');
};
$.ajax({
type: "GET",
url: "/clase/do-check",
data: {id: id}, // id for check
dataType: "json",
success: function(data) {
if (!data.ok)
fError();
},
error: function () {
fError();
}
});
}
...