node.js - 带有 express 的 Node 发射器

标签 node.js express

我想在后端进行串行工作。我想选择 geo_unit 并做另一项工作并向客户端写入响应。
我读了 http://nodejs.org/docs/v0.4.7/api/events.html#eventsError: Can't set headers after they are sent to the client

当我缓慢发送请求时,一切正常,例如每 3 秒 1 次。

但是当我快速发送请求时它不起作用。我收到以下错误。
我是否在全局范围内定义了一些东西?

错误:发送后无法设置 header 。
在 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 = 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');
varcheerio = require('cheerio');

var mysql = require('mysql');
var 池 = mysql.createPool({
主机:'本地主机',
用户:'根',
数据库:'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 引擎', ' 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 服务器监听端口' + app.get('port'));
});

而 myModule 就是这样

var request = require('request');
varcheerio = require('cheerio');
var iconv = require('iconv-lite');
var EventEmitter = require('events').EventEmitter;
var 发射器 = 新的 EventEmitter();

功能刮板API(池){
this.scrap = 函数 (req, res,next) {
var 查询 = req.query;
console.log('req.params:'+req.query);
console.log('IL_ID:'+query.il_id);
发射器.emit('位置',查询);
发射器.on('成功',功能(行){
res.json(行);
});

};

发射器.on('位置',功能(查询){
console.log('quey1:'+query);
获取外部位置(查询)
});

var getExternalLocation = 函数(查询){
尝试 {
pool.getConnection(函数(错误,连接){

console.log('查询:'+查询);
connection.query("select * from external_geo_units where geo_unit_id = ?",query.il_id, function (err, rows) {
控制台日志(错误);
如果(错误)回调(错误);
发射器.emit('success',rows);
connection.release();
});

});
} catch (e){
控制台日志(e);
}

};
}

module.exports.newScrapperAPI = 函数(池){
返回新的 ScrapperAPI(池);
}

最佳答案

以这种方式使用 EventEmitter 并不是您正在做的事情的最佳解决方案,因为您只是在请求中使用它来进行数据库调用并返回一些行 - 可以更轻松,更简单地完成只是回调。

但是如果你想保留全局EventEmitter,你必须切换onemitter.on('success'emitter.on('location'once相反,以确保每个请求只调用一次。

关于node.js - 带有 express 的 Node 发射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23311998/

相关文章:

node.js - 使用从 Node.js (Express.js) 注入(inject)的模板的 Backbone.js View

javascript - 在 Mongoose 中搜索和从数组中删除的最佳方式

html - Nodejs Express 不加载脚本文件

node.js - 如何从不记名 token 中提取 token 字符串?

mysql - 序列化分组最大值

python - SocketIO 从 Node 服务器发送到 Python 客户端

javascript - Node.js:异步回调 vs 同步回调 vs process.nextTick vs setTimeout

node.js - keycloak-nodejs-connect : Could not obtain grant code: 400:Bad Request

node.js - Expressjs REST API 资源管理器

javascript - 如何使用 puppeteer 查找网页上的所有资源?