Heim  >  Artikel  >  Web-Frontend  >  Es wurde festgestellt, dass 404 lange Zeit nicht in NodeJS reagierte

Es wurde festgestellt, dass 404 lange Zeit nicht in NodeJS reagierte

亚连
亚连Original
2018-06-21 17:08:321328Durchsuche

In diesem Artikel wird hauptsächlich die Lösung für das Problem beschrieben, dass 404 lange Zeit keine Antwort sendet, wenn NodeJS HTTP-Anfragen sendet.

Wenn wir NodeJS zum Senden von HTTP-Anfragen verwenden, erhalten wir normalerweise eine 404-Antwort. Nodejs wird intern so lange Anfragen stellen, bis die eigene festgelegte Antwortzeit überschritten wird (das Schlimmste daran ist, dass dieser Zeitraum nicht geändert werden kann). Viele Leute sind hier auf Probleme gestoßen.

Als ich am Arcgis-Kartenprojekt arbeitete, bat mich der Kunde, den von Tiantu bereitgestellten Basiskartendienst zu verwenden. Damals habe ich direkt die Arcgis-API des Silverlight-Clients verwendet, um http-Anfragen zu stellen (auch (eine interne Anfrage, keine Open-Source-Sache) Es ist so frustrierend) und ich bin auch auf ein Problem gestoßen, bei dem der Fortschrittsbalken dort hängen geblieben ist. Nach dem Debuggen wurde festgestellt, dass dies an der Zeitüberschreitung beim Laden der Grundkarte lag. Ebenso wie bei NodeJS stellte Silverlight so lange Anfragen, bis das von ihm festgelegte Antwortzeitlimit überschritten wurde.

Also hatte ich zu dieser Zeit zufällig einige Amateurerfahrungen mit NodeJS und war der Meinung, dass die Leistung dieses Dings gut sein sollte, zumindest besser als die von Tomcat + Java und dergleichen. Also begann ich, einen NodeJS-Proxy-Dienst zu schreiben, um die Basiskarte der Himmelskarte anzufordern. Damals dachte ich, dass nodejs die Anfrage direkt beenden könnte, wenn sie auf 404 stößt. Dieses Problem scheint jedoch ein Industriestandard zu sein. Es werden auch weiterhin Anfragen wie Silverlight gestellt ... Ich habe einfach die Informationen online überprüft und bin auf Folgendes gekommen zwei Absätze. Der Code löst das Problem, immer 404 anzufordern.

function proxyTDTMapData(img,level,row,col){ 
  var that = this,request = null,param = img.replace('_w',''); 
  var filename = tdtimgDir+'/'+img+'_'+level+'_'+row+'_'+col+'.png'; 
  path.exists(filename, function(exists) { 
    if (exists) { 
      readFileEntry(filename,that.res); 
    }else{ 
      var url = "http://t0.tianditu.com/"+img+"/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=" + param + "&tileMatrixSet=w&TileRow=" + row + "&TileCol=" + col + "&TileMatrix=" + level + "&style=default&format=tiles"; 
       
      httpGetWithTimeoutSupport(url,4000,function(response){ 
        //console.log("have a response!"); 
        if(200 == response.statusCode){ 
          var size = 0; 
          var chunks = []; 
          response.on('data', function(chunk){ 
            size += chunk.length; 
            chunks.push(chunk); 
          }); 
          response.on('end', function(){ 
            var data = Buffer.concat(chunks, size); 
            that.res.writeHead(200, { 
              'Content-Type' : 'image/png', 
              'Content-Length' : data.length, 
              'Accept-Ranges' : 'bytes', 
              'Server' : 'Microsoft-IIS/7.5', 
              'X-Powered-By' : 'ASP.NET' 
            }); 
            that.res.write(data, "binary"); 
            that.res.end(); 
            fs.writeFile(tdtimgDir+'/'+img+'_'+level+'_'+row+'_'+col+'.png', data); 
           }); 
        }else{ 
          readFileEntry(mapDir+"/null.png",that.res); 
        } 
      }).on("error",function(){ 
        readFileEntry(mapDir+"/null.png",that.res); 
      }); 
    } 
  }); 
   
   
 }
function httpGetWithTimeoutSupport(options, timeout, callback) { 
  var timeoutEvent; 
 
  var req = http.get(options, function(res) { 
    res.on("end", function() { 
      clearTimeout(timeoutEvent); 
      // console.log("end"); 
    }) 
    res.on("close", function(e) { 
      clearTimeout(timeoutEvent); 
      // console.log("close"); 
    }) 
 
    res.on("abort", function() { 
      // console.log("abort"); 
    }); 
 
    res.on("error",function(){ 
      try{ 
        res.destory(); 
        clearTimeout(timeoutEvent); 
        //console.log("res error catch"); 
      }catch(e){ 
       
      } 
    }); 
    callback(res); 
  }); 
 
  req.on("timeout", function() { 
    //console.log("request emit timeout received"); 
    try{ 
      if (req.res) { 
        req.res.emit("abort"); 
      } 
      clearTimeout(timeoutEvent); 
      req.abort(); 
    }catch(e){ 
      //console.log("req timeout failed!"); 
    } 
  }); 
  req.on("error",function(){ 
    try{ 
      //console.log("req error catch"); 
    }catch(e){ 
     
    } 
  }); 
  timeoutEvent = setTimeout(function() { 
    try{ 
      req.emit("timeout"); 
    }catch(e){ 
      //console.log("timeout failed!"); 
    } 
  }, timeout); 
 
  return req; 
}

Das Prinzip besteht darin, mehrere von nodejs angeforderte Ereignisse und Timer zu verwenden. Sobald die eingestellte Antwortzeit überschritten ist, wird die Anfrage sofort beendet. Auf diese Weise wird das Problem gelöst, dass der Fortschrittsbalken hängen bleibt.
Aufmerksame Leser haben vielleicht den Code gesehen

path.exists(filename, function(exists) { 
    if (exists) { 
      readFileEntry(filename,that.res); 
    }else{...});

Tatsächlich erfolgt hier das serverseitige Zwischenspeichern von Bildern. Sobald das Grundkartenbild geladen ist, wird es erheblich beschleunigt die Zugriffsgeschwindigkeit (dies verbessert die Effizienz um mindestens das Zehnfache).
Wie implementiert die Arcgis-API für Silverlight das Laden von Himmelskarten-Grundkarten und anderen Grundkartendiensten (z. B. nicht standardmäßigen Grundkartendiensten des lokalen Mercator-Koordinatensystems)? Bitte hören Sie sich beim nächsten Mal meine Erklärung an.

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

So implementieren Sie verzögertes Laden von Routen im Vue-Router

So implementieren Sie das Breakpoint-Debugging von TS-Dateien in Angular2

So scrollen Sie auf der Webseite nach oben

Das obige ist der detaillierte Inhalt vonEs wurde festgestellt, dass 404 lange Zeit nicht in NodeJS reagierte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn