2016-09-02 2 views
0

Ich habe noch ein weiteres "kann Header nicht einstellen, nachdem sie gesendet werden." Problem. Ich habe einen Post-Router erstellt, der ein großes Objekt mit URLs empfängt, für das ich die Verarbeitung benötige.Header können nach dem Senden nicht festgelegt werden. Nodejs Express

Die Verarbeitung besteht aus dem Crawlen aller URLs, die das Objekt enthält. Ich habe einen Flaschenhals mit maximal 10 gleichzeitigen Crawls und einer Wartezeit von 800 Millisekunden gesetzt.

In jedem Fall ist es möglich, dass die Daten ankommen und protokollieren, aber wenn ich meine Funktion anrufe, die die Daten verarbeiten soll, löst meine Anwendung eine Ausnahme aus.

Beitrag Router

router.post('/crawledUrls', function (req, res, err) { 
    crawler = new crawlerClass(); 
    var urlArray = JSON.parse(req.body); 
    crawler.crawlArrayUrls(urlArray); 
    res.send({message: "Array sent successfully!"}); 
}); 

crawler.crawlArrayUrls

crawlerClass.prototype.crawlArrayUrls = function (arrayObject) { 
var itemsProcessed = 0; 
var emptyUrlArray = []; 
var newArray = []; 
for(keys in arrayObject){ 
    newArray.push(arrayObject[keys]); 
} 
var limiter = new Bottleneck(10, 800); 
newArray.forEach(function (listItem, indexArray, err) { 
    limiter.submit(err, function() { 
     if(err) throw err; 
     request({ 
      encoding: null, 
      method: "GET", 
      headers: { 
       'User-Agent': 'request' 
      }, 
      uri: listItem 
     }, function (error, response, body, err) { 
      if(err) throw err; 
      $ = cheerio.load(body); 
      if($('div.alert.alert-danger').html() == undefined) { 
       console.log(listItem); 
       emptyUrlArray.push(listItem); 
      } else { 
       console.log("Else"); 
       //Not done. 
      } 
     }); 
    }); 
}); 

};

App.js

var express = require('express'); 
var session = require('express-session'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
//var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var scheduleObject = require('./UtilityLogic/scheduleObject'); 
var scheduleBidding = require("./GoogleAPILogic/scheduleBidding"); 
var dbModules = require("./DBLogic/dbModules"); 
var routes = require('./routes/index'); 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
app.enable('trust proxy'); 

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

app.use(session({ 
    secret: 'secret', 
    resave: false, 
    saveUninitialized: true, 
    cookie: { 
     httpOnly: true, 
     secure: true 
    } 
})); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
     throw err; 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 

var scheduler = new scheduleObject(); 
var dbObject = new dbModules("./somePath"); 
var scheduleBidObject = new scheduleBidding("someKey"); 

//Test connection to DB 
dbObject.testConnectionToDB(); 

scheduler.scheduleFunction('59 59 23 * * *',function(){ 
    scheduleBidObject.getBiddingHeaders('/SomePath/'); 
}); 

scheduler.scheduleFunction('01 e 10 00 * * *',function(){ 
    scheduleBidObject.getBiddingHeaders('/SomePath/'); 
}); 

module.exports = app; 

Exception geworfen

Error: Can't set headers after they are sent. 
www-2  at ServerResponse.OutgoingMessage.setHeader (http.js:691:11) 
www-2  at ServerResponse.header (/somePath/node_modules/express/lib/response.js:719:10) 
www-2  at ServerResponse.send (/somePath/node_modules/express/lib/response.js:164:12) 
www-2  at done (/somePath/node_modules/express/lib/response.js:956:10) 
www-2  at Object.exports.renderFile (/somePath/node_modules/jade/lib/index.js:374:12) 
www-2  at View.exports.__express [as engine] (/somePath/node_modules/jade/lib/index.js:417:11) 
www-2  at View.render (/somePath/node_modules/express/lib/view.js:126:8) 
www-2  at tryRender (/somePath/node_modules/express/lib/application.js:639:10) 
www-2  at EventEmitter.render (/somePath/node_modules/express/lib/application.js:591:3) 
www-2  at ServerResponse.render (/somePath/node_modules/express/lib/response.js:960:7) 
+0

, was der Code ist für '// Do etwas mit dem Körper? – BlackMamba

+0

Der Code wurde jetzt aktualisiert. Ich kümmere mich um bestimmte Elemente auf der gegebenen Webseite. – Thyregod

+0

Mögliches Duplikat von [Node.js Fehler: Header können nach dem Senden nicht gesetzt werden] (http://stackoverflow.com/questions/7042340/node-js-error-cant-set-headers-after-they-are (ss) –

Antwort

0

Das Problem war, dass ich die die Ausnahme durch eine Jade-Vorlage inzwischen zurückkehrte habe ich versucht, eine JSON-Antwort zurück. Nach bearbeiten mein Problem gelöst:

Vorher:

app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 

Nach:

app.use(function(err, req, res, next) { 
    if(req.body){ 
     throw err; 
    } else { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: {} 
     }); 
    } 
}); 
0

Wenn Sie Routen in Express ausführen,

router.get('/favicon.ico', (req, res) => { 
    res.destroy(); 
}); 
Verwandte Themen