节点发射器与快递
我想在后台进行串行工作。 我想selectgeo_unit,并做另一项工作,并写入响应客户端。 我阅读http://nodejs.org/docs/v0.4.7/api/events.html#events和错误:发送到客户端后无法设置标头
当我缓慢地发送请求时,一切正常,例如每3秒发送一次。
但是,当我快速发送请求时,它不起作用。 我得到以下错误。 我是否在全球定义一些东西
错误:发送后无法设置标题。 在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) (E:\ git \ xxxxxx-nodejs \ node_modules \ express \ lib \ response.js:527:10)在ServerResponse.res.set.res.header 在ServerResponse.res.json(E:\ git \ xxxxxx-nodejs \ node_modules \ express \ lib \ response.js:194:36) 在EventEmitter。 (E:\ GIT中\ XXXXXX-的NodeJS \路由\ 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 = require('http'), path = require('path'); var app = module.exports = express(); var server = require('http')。createServer(app); var io = require('socket.io')。listen(server); var request = require('request'); var cheerio = require('cheerio'); var mysql = require('mysql'); var pool = mysql.createPool({ 主机:'localhost', 用户:“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('view engine','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',sahibinden.scrap); server.listen(app.get('port'),function(){ console.log('Express server listen on port'+ app.get('port')); });
和myModule是这样的
var request = require('request'); var cheerio = require('cheerio'); var iconv = require('iconv-lite'); var EventEmitter = require('events')。EventEmitter; var emitter = new EventEmitter(); 函数ScrapperAPI(pool){ this.scrap = function(req,res,next){ var query = req.query; 的console.log( 'req.params:' + req.query); 的console.log( 'IL_ID:' + query.il_id); emitter.emit( '位置',查询); emitter.on( '成功',函数(行){ res.json(行); }); }; emitter.on( '位置',function(查询){ 的console.log( 'quey1:' +查询); getExternalLocation(查询) }); var getExternalLocation = function(query){ 尝试{ pool.getConnection(function(err,connection){ 的console.log( '查询:' +查询); connection.query(“select * from external_geo_units where geo_unit_id =?”,query.il_id,function(err,rows){ 的console.log(ERR); (err)callback(err); emitter.emit( '成功',行); connection.release(); }); }); catch(e){ 的console.log(E); } }; } module.exports.newScrapperAPI = function(pool){ 返回新的ScrapperAPI(池); }
以这种方式使用EventEmitter并不是你正在做的最好的解决scheme,因为你只是在一个请求中使用它来进行数据库调用并返回一些行 – 这可以更容易和简单地完成只是callback。
但是,如果你想保持全局的EventEmitter,你必须将emitter.on('success'
和emitter.on('location'
开关切换到once
,以确保每次请求只调用一次。