2017-07-21 1 views
1

Ich habe ein Skript, das die Fehler erfassen und an meinen Server senden. Aber ich bin besorgt, dass, wenn ich viele Benutzer habe und jeder Benutzer ein paar Fehler bekommt, kann es meinen Server zusammenbrechen.Senden Sie Javascript-Fehler an Server

Dies ist mein Code:

window.onerror = function(msg, url, num) { 
    try { 
    var clientSideErrorInfo = { 
     message: msg, 
     url: url, 
     num: num 
    }; 

    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", 'http://domain/api/v1/browser/', true); 
    xhr.setRequestHeader("Content-Type", "application/json"); 
    xhr.send(JSON.stringify(clientSideErrorInfo)); 

    console.log(clientSideErrorInfo) 
    } catch (e) { 
    console.log(e); 
    // Don't allow for infinitely recursively unhandled errors 
    return true; 
    } 
}; 

Gibt es eine Möglichkeit, eine Gruppe von Protokollen zu senden, statt sie eins nach dem anderen zu senden?

Dank

+2

erwarten Sie können und es auf der Clientseite drosseln sollte, aber Ihr Server vor dem Zusammenbruch zu schützen, müssen Sie Suchen Sie nach einer serverseitigen Strategie, weil ein böswilliger Client Ihre API missbrauchen könnte. Wenn ein Client zu viele Anfragen erstellt, sollte Ihr Server eine '429' zurücksenden, so dass der Client einerseits weiß, dass er die Anfragen drosseln sollte. Ihr Server sollte dann aber auch alle weiteren Anfragen abweisen, bis er wieder abkühlt. –

Antwort

2

Statt den Fehler zur Zeit des Sendens Sie es bekommen, könnten Sie alle Fehler in einer globalen Variablen sammeln und Sie sie mit einem Intervall senden. Auf diese Weise können Sie begrenzen, wie viele Fehler Sie gleichzeitig senden möchten, und Sie könnten auch Ihr Intervall erhöhen.

var errorSend = {}; 
errorSend.listErrors = []; 
errorSend.maxErrors = 50; 
errorSend.interval = 100; 

window.onerror = function(msg, url, num) { 

    var clientSideErrorInfo = { 
     message: msg, 
     url: url, 
     num: num 
    }; 

    listErrors.push(clientSideErrorInfo); 
    console.log(clientSideErrorInfo) 

}; 

function sendErrors() { 
    if (errorSend.listErrors>errorSend.maxErrors) { 
     console.log("Too many errors to send"); 
     return; 
    } 
    var errors = {list: errorSend.listErrors}; 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", 'http://domain/api/v1/browser/', true); 
    xhr.setRequestHeader("Content-Type", "application/json"); 
    xhr.send(JSON.stringify(errors)); 


} 
setInterval(sendErrors,errorSend.interval); 
+0

Danke. Ich könnte "window.onbeforeunload" verwenden, um die Protokolle anstelle von Intervall zu senden oder beide Methoden zu verwenden. –

2

Etwas sehr einfach, umm:

var body =[]; 

    setInterval(function(){ 
     //Using a copy of the error queue 
     let batch = body.slice(); 
     var xhr = new XMLHttpRequest(); 
     xhr.open("POST", 'http://domain/api/v1/browser/', true); 
     xhr.setRequestHeader("Content-Type", "application/json"); 
     let myJson = JSON.stringify(body); 
     xhr.send({ 
      data:{ 
       param: myJson 
      } 
     }); 
     //Updating the main queue to contain only unsent error messages 
     body=body.slice(batch.length,body.length); 
    },time_you_specify); 

    window.onerror = function(msg, url, num) { 
     try { 
     var clientSideErrorInfo = { 
      message: msg, 
      url: url, 
      num: num 
     }; 

     body.push(clientSideErrorInfo); 

     console.log(clientSideErrorInfo) 
     } catch (e) { 
     console.log(e); 
     // Don't allow for infinitely recursively unhandled errors 
     return true; 
     } 
    }; 
1

Ist das nicht Problem für diesen Job, aber wenn Sie eine Menge von Fehlern in Ihnen Web-App kann Problem sein. Zuerst müssen Sie Ihren Javascript-Code auf den perfekten Zustand einstellen. In diesem Fall ist Ihre Idee gut (fangen Sie jeden möglichen Fehler ein). Legen Sie es einfach in eine Tabelle auf dem Server. Heres von mozilla dev Seite über param:

window.onerror = function (msg, url, lineNo, columnNo, error) { 
    var string = msg.toLowerCase(); 
    var substring = "script error"; 
    if (string.indexOf(substring) > -1){ 
     alert('Script Error: See Browser Console for Detail'); 
    } else { 
     var message = [ 
      'Message: ' + msg, 
      'URL: ' + url, 
      'Line: ' + lineNo, 
      'Column: ' + columnNo, 
      'Error object: ' + JSON.stringify(error) 
     ].join(' - '); 

     alert(message); 
    } 

    return false; 
}; 

Sehr wichtige Anwendung (Useragent) detectBrowser Daten, müssen Sie wissen, welches Gerät auch Funktion intro Ihrer Daten, den Browser verwendet wird, wird verwendet, -Just hinzufügen. In 90% wird Ihr Client-Fehler nur auf bestimmten Plattformen auftreten. Zum Beispiel auf Android-Chrom ver < 23 ...

Bitte verwenden Sie nicht Intervall für diese Art von Aufgaben, nur bei Fehler Catch-Ereignis senden Fehlerprotokoll auf den Server genau wie Sie bereits getan haben!

0

Es ist besser Nachricht Queuing-Infrastruktur zu verwenden, wenn Sie Millionen von Nachrichten

some sample

Verwandte Themen