Http.get schlägt die meiste Zeit fehl, während file_get_contents nicht fehlschlägt. Was mache ich mit meinem Node-SkriptPhp

PHP-Programmierer chatten hier
Guest
 Http.get schlägt die meiste Zeit fehl, während file_get_contents nicht fehlschlägt. Was mache ich mit meinem Node-Skript

Post by Guest »

Ich verwende den Knoten, um Daten von der Überführung herunterzuladen. Ich erhalte ständig Fehlermeldungen (siehe weiter unten). Wenn ich jedoch file_get_contents im Codeigniter verwende, erhalte ich nie Fehlermeldungen und die Daten werden nicht reibungslos heruntergeladen. Ich frage mich, was ich mit meinem Knotenskript falsch mache? Ich habe sogar weitere Downloadversuche hinzugefügt und das Timeout erhöht, aber kein Glück.
Dies ist mein Knotenskript:

Code: Select all

const fs = require('fs');
const path = require('path');
const http = require('http');

// Overpass API URL and query
const overpassUrl = 'http://overpass-api.de/api/interpreter';
const query = '[out:xml][timeout:25];area(3600382313)->.searchArea;(nwr["landuse"="winter_sports"](area.searchArea););out geom;';

// Path for the temporary XML file
const xmlFilePath = path.join(__dirname, '../writable/ski/sknowed_calcs/aa_winter_sports_polygons.xml');

// Maximum number of retries
const maxRetries = 3;

// Function to fetch data
function fetchData(retries = 0) {
console.log(`Fetching data from Overpass API... (Attempt ${retries + 1}/${maxRetries})`);

// Encode query for URL
const url = `${overpassUrl}?data=${encodeURIComponent(query)}`;

// Send HTTP GET request with increased timeout
http.get(url, { timeout: 220000 }, (res) => {
res.setEncoding('utf8'); // Ensure response is treated as UTF-8

if (res.statusCode !== 200) {
console.error(`Failed to fetch data: ${res.statusCode} ${res.statusMessage}`);
res.resume(); // Consume response to free up memory
return;
}

let xmlData = '';

// Collect data chunks
res.on('data', (chunk) => {
xmlData += chunk;
});

// When the entire response is received
res.on('end', () => {
console.log('Data fetched successfully.');

// Ensure directory exists
fs.mkdirSync(path.dirname(xmlFilePath), { recursive: true });

// Save the XML response to a file with UTF-8 encoding
fs.writeFileSync(xmlFilePath, xmlData, 'utf8');
console.log(`XML file saved at ${xmlFilePath}`);
});
}).on('error', (error) => {
if (error.code === 'ETIMEDOUT' && retries < maxRetries - 1) {
console.error(`Request timed out. Retrying... (${retries + 1}/${maxRetries})`);
setTimeout(() => fetchData(retries + 1), 5000); // Retry after 5 seconds
} else {
console.error('Request failed:', error);
}
});
}

// Run the function
fetchData();
Dies ist die Fehlermeldung, die ich erhalte:

Code: Select all

Fetching data from Overpass API... (Attempt 1/3)
Fetching data from Overpass API... (Attempt 2/3)
Fetching data from Overpass API... (Attempt 3/3)

Request timed out. Retrying... (1/3)
Request timed out. Retrying...  (2/3)
Request failed: AggregateError [ETIMEDOUT]:
at internalConnectMultiple (node:net:1139:18)
at internalConnectMultiple (node:net:1215:5)
at Timeout.internalConnectMultipleTimeout (node:net:1739:5)
at listOnTimeout (node:internal/timers:616:11)
at process.processTimers (node:internal/timers:549:7) {
code: 'ETIMEDOUT',
[errors]: [
Error: connect ETIMEDOUT 162.55.144.139:80
at createConnectionError (node:net:1675:14)
at Timeout.internalConnectMultipleTimeout (node:net:1734:38)
at listOnTimeout (node:internal/timers:616:11)
at process.processTimers (node:internal/timers:549:7) {
errno: -110,
code: 'ETIMEDOUT',
syscall: 'connect',
address: '162.55.144.139',
port: 80
},
Error: connect ENETUNREACH 2a01:4f8:261:3c4f::2:80 - Local (:::0)
at internalConnectMultiple (node:net:1211:16)
at Timeout.internalConnectMultipleTimeout (node:net:1739:5)
at listOnTimeout (node:internal/timers:616:11)
at process.processTimers (node:internal/timers:549:7) {
errno: -101,
code: 'ENETUNREACH',
syscall: 'connect',
address: '2a01:4f8:261:3c4f::2',
port: 80
},
Error: connect ETIMEDOUT 65.109.112.52:80
at createConnectionError (node:net:1675:14)
at Timeout.internalConnectMultipleTimeout (node:net:1734:38)
at listOnTimeout (node:internal/timers:616:11)
at process.processTimers (node:internal/timers:549:7) {
errno: -110,
code: 'ETIMEDOUT',
syscall: 'connect',
address: '65.109.112.52',
port: 80
},
Error: connect ENETUNREACH 2a01:4f9:3051:3e48::2:80 - Local (:::0)
at internalConnectMultiple (node:net:1211:16)
at Timeout.internalConnectMultipleTimeout (node:net:1739:5)
at listOnTimeout (node:internal/timers:616:11)
at process.processTimers (node:internal/timers:549:7) {
errno: -101,
code: 'ENETUNREACH',
syscall: 'connect',
address: '2a01:4f9:3051:3e48::2',
port: 80
}
]
}
Und das ist mein Codeigniter4-Skript, das nie fehlschlägt:

Code: Select all

    public function osm_get_aa_winter_sports_polygons(){

helper('filesystem');
$query_get_skiArea = urlencode('[out:xml][timeout:25];area(3600382313)->.searchArea;(nwr["landuse"="winter_sports"](area.searchArea););out geom;');
$overpass = 'http://overpass-api.de/api/interpreter?data='.$query_get_skiArea;
$html = file_get_contents($overpass);
if (write_file(WRITEPATH. "/ski/osm_data/temp_aa_winter_sports_polygons.xml", $html)){
if (file_exists(WRITEPATH.'/ski/osm_data/aa_winter_sports_polygons.geojson')) {
$fileD = "aa_winter_sports_polygons.geojson.".date('m-d-Y-H-i-s'); //A e
@rename(WRITEPATH.'ski/osm_data/aa_winter_sports_polygons.geojson', WRITEPATH.'ski/'.$fileD);
}
exec('osmtogeojson '.WRITEPATH.'/ski/osm_data/temp_aa_winter_sports_polygons.xml > '.WRITEPATH.'/ski/osm_data/aa_winter_sports_polygons.geojson');
return redirect()->to('/admin/ski/osm_data')
->with('info', 'Success - aa_winter_sports_polygons data');
} else {
// dd($TaskResult);
$error = "something happened Harry";
return redirect()->back()
->with('errors', $error)
->with('warning', 'Invalid Data')
->withInput();
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post