2016-07-21 21 views
0

Wie man Knoten js auf die Ausführung der Funktion warten lässt (auch wenn es Zeit braucht) und dann die nächste ausführen Erklärung . für mich Problem ist für Schleife druckt alle URLs zuerst es wartet nicht auf Require Request-Funktion, um jede URL die HTTP-Antwort zu überprüfen. Es druckt nur alle URLs. beacuse diese i der Störung erhaltenWie man Knoten js auf die Ausführung der Funktion warten lässt (selbst wenn es Zeit braucht) und dann die nächste Anweisung ausführt

console.log(dd[i]['loc'][0]); 
       ^

Typeerror: kann Eigenschaft 'loc' undefinierter

meiner vollständigen Quellcode ist als unten

 var hapi = require('hapi'); 
    var glue = require('glue'); 
    var joi = require('joi'); 
    var handlebars = require('handlebars'); 
    var strop = require('string'); 
    var inert = require('inert'); 
    var async = require('async'); 
    var poop = require('poop'); 
    var bell = require('bell'); 
    var nconf = require('nconf'); 

    //xml parser starts 

    var fs = require('fs'), 
     xml2js = require('xml2js'); 

    var parser = new xml2js.Parser(); 
    fs.readFile('sitemapscene1.xml', function(err, data) { 
    var count = 0; 
    var a=0; 
    var b=0; 
    var c=0; 
    var d=0; 
    var e=0; 
    var f=0; 
    var g=0; 
    var h=0; 
    //parsing inside url starts 
    var parseString = require('xml2js').parseString; 

     parser.parseString(data, function (err, result) { 
      ff = result; 
      dd = ff['urlset']['url']; 

      for (i =0; i< dd.length; i++){ 
      console.log(dd[i]['loc'][0]); 
    //server reuest and checking 
    var request = require('request'); 
    request(dd[i]['loc'][0], function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     console.log(dd[i]['loc'][0]); 
     console.log("This url http response is 200"); 
     count=count+1; 
     console.log(count); 
     } 
    }) 



    } 
    console.log("Total number of urls in this sitemap"); 
      console.log(dd.length); 
      }); 

     }); 


    //xml parser ends 

My full error code is 

    Total number of urls in this sitemap 
22569 

    console.log(dd[i]['loc'][0]); 
        ^

TypeError: Cannot read property 'loc' of undefined 
    at Request._callback 
    at Request.self.callback 
    at emitTwo (events.js:87:13) 
    at Request.emit (events.js:172:7) 
    at Request.<anonymous> 
    at emitOne (events.js:77:13) 
    at Request.emit (events.js:169:7) 
    at IncomingMessage.<anonymous> 
    at emitNone (events.js:72:20) 
    at IncomingMessage.emit (events.js:166:7) 

Mein tatsächlicher vollständiger Code

lesen
var hapi = require('hapi'); 
var glue = require('glue'); 
var joi = require('joi'); 
var handlebars = require('handlebars'); 
var strop = require('string'); 
var inert = require('inert'); 
var async = require('async'); 
var poop = require('poop'); 
var bell = require('bell'); 
var nconf = require('nconf'); 
var async = require('async'); 

//xml parser starts 

var fs = require('fs'), 
    xml2js = require('xml2js'); 

var parser = new xml2js.Parser(); 
fs.readFile('sitemapscene1.xml', function(err, data) { 
var count = 0; 
var a=0; 
var b=0; 
var c=0; 
var d=0; 
var e=0; 
var f=0; 
var g=0; 
var h=0; 
//parsing inside url starts 
var parseString = require('xml2js').parseString; 

    parser.parseString(data, function (err, result) { 
     ff = result; 
     dd = ff['urlset']['url']; 
     console.log("Total number of urls in this sitemap"); 
     console.log(dd.length); 
     for (i =0; i< dd.length; i++){ 
     console.log(dd[i]['loc'][0]); 

//sending to server to get response 
var request = require("request"); 

request(dd[i]['loc'][0], function(error, response, body) { 
    //console.log(response.statuscode); 
if (!error && response.statusCode == 200) { 

    count=count+1; 

    console.log("Number of pages with responese.statuscode 200 is"); 
    console.log(count); 

    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    } else if (error && response.statusCode == 400) { 

     a=a+1; 
    console.log("Number of pages with responese.statuscode 400 is"); 
    console.log(a); 
    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    }else if (error && response.statusCode == 402) { 

     b=b+1; 
    console.log("Number of pages with responese.statuscode 402 is"); 
    console.log(b); 
    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    }else if (error && response.statusCode == 403) { 

     c=c+1; 
    console.log("Number of pages with responese.statuscode 403 is"); 
    console.log(c); 
    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    }else if (error && response.statusCode == 404) { 

     d=d+1; 
    console.log("Number of pages with responese.statuscode 404 is"); 
    console.log(d); 

    }else if (error && response.statusCode == 500) { 

     e=e+1; 
    console.log("Number of pages with responese.statuscode 500 is"); 
    console.log(e); 
    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    }else if (error && response.statusCode == 502) { 

     f=f+1; 
    console.log("Number of pages with responese.statuscode 502 is"); 
    console.log(f); 
    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    }else if (error && response.statusCode == 504) { 

     g=g+1; 
    console.log("Number of pages with responese.statuscode 504 is"); 
    console.log(g); 
    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    } else { 

     h=h+1; 
    console.log("Number of pages with error is"); 
    console.log(h); 
    var ddddd = "Number of pages with responese.statuscode 200 is " + count + " " + dd[i]['loc'][0] 
// output is wriiten in output.txt file start here 

fs = require('fs'); 
fs.writeFile('output.txt', ddddd, function (err) { 
    if (err) return console.log(err); 
    console.log('Hello World > output.txt'); 
}); 

// output is wriiten in output.txt file ends here 

    } 



}); 

     } 
     //console.log("Number of urls,in this site map"); 
     //console.log(dd.length); //number of urls 
    }); 
}); 

//xml parser ends 

Thi s ist der Code, der Absturz der Server, ich glaube, ich Fehler im Code als Server laufen aus dem Speicher

var hapi = require('hapi'); 
var glue = require('glue'); 
var joi = require('joi'); 
var handlebars = require('handlebars'); 
var strop = require('string'); 
var inert = require('inert'); 
var async = require('async'); 
var poop = require('poop'); 
var bell = require('bell'); 
var nconf = require('nconf'); 
var async = require('async'); 

//xml parser starts 

var fs = require('fs'), 
    xml2js = require('xml2js'); 

var parser = new xml2js.Parser(); 
fs.readFile('sitemapscene1.xml', function(err, data) { 
var count = 0; 
var a=0; 
var b=0; 
var c=0; 
var d=0; 
var e=0; 
var f=0; 
var g=0; 
var h=0; 
//parsing inside url starts 
var parseString = require('xml2js').parseString; 

    parser.parseString(data, function (err, result) { 
     ff = result; 
     dd = ff['urlset']['url']; 

     for (i =0; i< dd.length; i++){ 
     console.log(dd[i]['loc'][0]); 
//server reuest and checking 
var asyncRequests = []; 
var request = require('request'); 

dd.forEach(function(ddElement){ 
    asyncRequests.push(function(callback){ 
     request(ddElement.loc[0], function(error, response, body) { 
      if (!error && response.statusCode == 200) { 
       return callback(null, 1); 
      } 

     callback(); 
     }); 
    }); 
}); 

async.parallel(asyncRequests, function afterStatement(err, results){ 
    var count = 0; 

    for (var i = 0; i < results.length; i ++){ 
       if (results[i]){ 
      count += results[i]; 
     } 
    } 
}); 



} 
console.log("Total number of urls in this sitemap"); 
     console.log(dd.length); 
     }); 

    }); 


//xml parser ends 
+0

Sie sitemapscene1.xml Datei zur Verfügung stellen kann, wie Gut ? –

+0

NodeJS ist nicht blockierend ... glaube nicht, dass es eine gute Idee ist, es zu "blockieren". http://StackOverflow.com/a/14797359/4838205 –

+0

meine .xml-Datei besteht aus 26k URLs, so kann ich hier nicht setzen –

Antwort

1

Sie benötigen async, machte also warum nicht Sie es verwenden?

var asyncRequests = []; 
var request = require('request'); 

dd.forEach(function(ddElement){ 
    asyncRequests.push(function(callback){ 
     request(ddElement.loc[0], function(error, response, body) { 
      if (!error && response.statusCode == 200) { 
       return callback(null, 1); 
      } 

     callback(); 
     }); 
    }); 
}); 

async.parallel(asyncRequests, function afterStatement(err, results){ 
    var count = 0; 

    for (var i = 0; i < results.length; i ++){ 
     // I don't remember if something is send with callback(), so check data 
     if (results[i]){ 
      count += results[i]; 
     } 
    } 
}); 

Und bitte, das nächste Mal, lesbar und gegliederten Code senden.

EDIT: Wenn Sie ein Objekt mit den Ergebnissen im Zusammenhang auf die Route bekommen zählen wollen (Ich halte ddElement.loc [0] die Route):

var asyncRequests = []; 
var request = require('request'); 

dd.forEach(function(ddElement){ 
    asyncRequests.push(function(callback){ 
     request(ddElement.loc[0], function(error, response, body) { 
      callback(error, { 
       statusCode : response.statusCode, 
       route : ddElement.loc[0] 
      }); 
     }); 
    }); 
}); 

async.parallel(asyncRequests, function afterStatement(err, results){ 
    if (err){ 
     console.error(err); 
    } 

    console.log(results); 
}); 
+0

Eigentlich versuche ich eine XML-Sitemap-Datei analysieren. Nehmen Sie URL in Ruhe und überprüfen Sie http-Antwort und drucken Sie, welche URL welche HTTP-Antwort erhält. und zählen zählen auch insgesamt URLs in Sitemap und Anzahl der URLs mit 200 Antwort, 400 Antwort, 404 Antwort, 500 Antwort ... –

+0

Vielen Dank für Ihren Code, aber immer noch bekomme ich Fehler –

+0

Ich füge einen Weg, um ein Objekt mit Routen und Ergebnisse. Sie können damit Statistiken erstellen. Und was ist dein Fehler? –