How to make node js to wait for function to execute (even if it take time) and then execute the next statement . for me problem is for loop prints all urls first it does nt wait for require request function to check each url the http response. It just prints all urls. beacuse of this i am getting the error
console.log(dd[i]['loc'][0]);
^
TypeError: Cannot read property 'loc' of undefined
my full source code is as below
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)
My actual full code
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
This is the code which crash the server, i think i made mistake in code than server run out of memory
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