节点发射器与快递

我想在后台进行串行工作。 我想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 ,以确保每次请求只调用一次。