发送后无法设置headers。节点快递
Can't set headers after they are sent. Nodejs Express
我还有一个 "Can't set headers after they are sent." 问题。我创建了一个 post 路由器,它接收大量 object 的 url,我需要对其进行处理。
处理过程包括抓取 object 包含的所有网址。我设置了一个瓶颈,最大并发爬取10个,等待时间800毫秒。
无论哪种方式,数据都有可能到达并记录下来,但是当我调用我的函数(假设它处理数据)时,我的应用程序抛出异常。
Post 路由器
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;
抛出异常
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)
问题是我 return 通过 jade 模板处理异常,同时我试图 return json 响应。以下编辑解决了我的问题:
之前:
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
之后:
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: {}
});
}
});
如果您是运行条快递路线,
router.get('/favicon.ico', (req, res) => {
res.destroy();
});
我还有一个 "Can't set headers after they are sent." 问题。我创建了一个 post 路由器,它接收大量 object 的 url,我需要对其进行处理。
处理过程包括抓取 object 包含的所有网址。我设置了一个瓶颈,最大并发爬取10个,等待时间800毫秒。
无论哪种方式,数据都有可能到达并记录下来,但是当我调用我的函数(假设它处理数据)时,我的应用程序抛出异常。
Post 路由器
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;
抛出异常
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)
问题是我 return 通过 jade 模板处理异常,同时我试图 return json 响应。以下编辑解决了我的问题:
之前:
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
之后:
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: {}
});
}
});
如果您是运行条快递路线,
router.get('/favicon.ico', (req, res) => {
res.destroy();
});