【发布时间】:2014-06-12 06:46:38
【问题描述】:
我想在后端进行串行工作。我想选择 geo_unit 并做另一项工作并向客户写响应。 我读了http://nodejs.org/docs/v0.4.7/api/events.html#events 和Error: Can't set headers after they are sent to the client
当我缓慢发送请求时一切正常,例如每 3 秒 1 次。
但是当我快速发送请求时它不起作用。我收到以下错误。 我是否在全局范围内定义某些东西?
错误:发送后无法设置标头。 在 ServerResponse.OutgoingMessage.setHeader (http.js:691:11) 在 ServerResponse.res.setHeader (E:\git\xxxxxx-nodejs\node_modules\express\node_modules\connect\lib\patch.js:63:22) 在 ServerResponse.res.set.res.header (E:\git\xxxxxx-nodejs\node_modules\express\lib\response.js:527:10) 在 ServerResponse.res.json (E:\git\xxxxxx-nodejs\node_modules\express\lib\response.js:194:36) 在 EventEmitter。 (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:17:17) 在 EventEmitter.emit (events.js:117:20) 在 ScrapperAPI.externalLocationCallback (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:27:20) 在 Query._callback (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:51:21) 在 Query.Sequence.end (E:\git\xxxxxx-nodejs\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:24) 在 Query._handleFinalResultPacket (E:\git\xxxxxx-nodejs\node_modules\mysql\lib\protocol\sequences\Query.js:143:8)我正在使用以下代码:
var express = require('express'), http = 要求('http'), 路径 = 要求('路径'); var app = module.exports = express(); var server = require('http').createServer(app); var io = require('socket.io').listen(server); var request = require('request'); var Cheerio = 要求('cheerio'); var mysql = 要求('mysql'); var pool = mysql.createPool({ 主机:'本地主机', 用户:'root', 数据库:'evevgez_development', 密码:'root', // socketPath : '/var/run/mysqld/mysqld.sock' }); var sahibinden = require('./routes/my_scrapper').newScrapperAPI(pool); app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('视图引擎', 'jade'); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(path.join(__dirname, 'public'))); app.use(app.router); app.use(express.errorHandler()); app.get('/node1', sahbinden.scrap); server.listen(app.get('port'), function () { console.log('Express 服务器监听端口' + app.get('port')); });myModule 就是这样的
var request = require('request'); var Cheerio = 要求('cheerio'); var iconv = require('iconv-lite'); var EventEmitter = require('events').EventEmitter; var 发射器=新的 EventEmitter(); 功能 ScrapperAPI(池){ this.scrap = function (req, res,next) { 变种查询 = req.query; console.log('req.params:'+req.query); console.log('IL_ID:'+query.il_id); 发射器.发射('位置',查询); 发射器.on('成功',函数(行){ res.json(行); }); }; 发射器.on('位置',功能(查询){ console.log('quey1:'+查询); 获取外部位置(查询) }); var getExternalLocation = 函数(查询){ 尝试 { pool.getConnection(函数(错误,连接){ console.log('查询:'+查询); connection.query("select * from external_geo_units where geo_unit_id = ?",query.il_id, function (err, rows) { 控制台日志(错误); 如果(错误)回调(错误); 发射器.emit('成功',rows); 连接.释放(); }); }); } 抓住 (e) { 控制台.log(e); } }; } module.exports.newScrapperAPI = 函数(池){ 返回新的 ScrapperAPI(pool); }【问题讨论】: