我想在后端进行串行工作。我想选择 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 次。
但是当我快速发送请求时它不起作用。我收到以下错误。
我是否在全局范围内定义了一些东西?
错误:发送后无法设置 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,你必须切换on
在 emitter.on('success'
和 emitter.on('location'
至 once
相反,以确保每个请求只调用一次。
关于node.js - 带有 express 的 Node 发射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23311998/