当前位置: 首页 > 知识库问答 >
问题:

带有express的节点发射器

冯枫
2023-03-14

我想在后端做连载工作。我想选择geo_unit并做另一项工作,向客户机写入响应。我阅读了http://nodejs.org/docs/v0.4.7/api/events.html#事件和错误:发送到客户端后不能设置头

当我缓慢地发送请求,例如每3秒发送1个请求时,所有的工作都很好。

但当我快速发送请求时,它就不起作用了。并得到以下错误。我是否在全球范围内定义某件事?


Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
    at ServerResponse.res.setHeader (E:\git\xxxxxx-nodejs\node_modules\express\node_modules\connect\lib\patch.js:63:22)
    at ServerResponse.res.set.res.header (E:\git\xxxxxx-nodejs\node_modules\express\lib\response.js:527:10)
    at ServerResponse.res.json (E:\git\xxxxxx-nodejs\node_modules\express\lib\response.js:194:36)
    at EventEmitter. (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:17:17)
    at EventEmitter.emit (events.js:117:20)
    at ScrapperAPI.externalLocationCallback (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:27:20)
    at Query._callback (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:51:21)
    at Query.Sequence.end (E:\git\xxxxxx-nodejs\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:24)
    at 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({
    host : 'localhost',
    user : 'root',
    database :'evevgez_development',
    password : '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 listening 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();


function 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('location',query);
        emitter.on('success',function(rows){
            res.json(rows);
        });

    };

    emitter.on('location',function(query){
        console.log('quey1:'+query);
        getExternalLocation(query )
    });

    var getExternalLocation = function (query ) {
        try {
            pool.getConnection(function (err, connection) {

                console.log('query:'+query);
                connection.query("select * from external_geo_units where geo_unit_id = ?  ",query.il_id, function (err, rows) {
                    console.log(err);
                    if (err)    callback(err);
                    emitter.emit('success',rows);
                    connection.release();
                });

            });
        } catch (e) {
            console.log(e);
        }

    };
}

module.exports.newScrapperAPI = function (pool) {
    return new ScrapperAPI(pool);
}

共有1个答案

苏磊
2023-03-14

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

但是,如果要保留全局EventEmitter,则必须将emitter.on('success'中的onemitter.on('location'中的once切换为once,以确保每个请求只调用它们一次。

 类似资料:
  • 问题内容: 我试图在节点中使用express来获得“ imdb评级”,我正在努力。 电影.json 结果 退货 但 //不返回8.4,只是崩溃的节点 和 //返回David和Goliath //返回Miles Sloman 我要去哪里错了? 问题答案: 根据文档: body参数可以是Buffer对象,String,对象或Array。 您不能自己发送号码。 尝试将数字转换为字符串 或将其作为对象值发

  • 问题内容: 有一个in ,但是我似乎无法使express static选项起作用。我删除并完成了操作,但仍然无法正常工作。我刚收到404错误。 我添加了一个块以确保express正常运行,但是我仍然无法请求静态文件。 问题答案: 对我来说很好。 app.js 自述文件

  • 问题内容: 如何使用与以下代码等效的node.js发出Http请求: 问题答案: 使用http客户端。 遵循以下原则:

  • 我有两个节点js应用程序,一个发送post请求,如下所示: 另一个是试图用表达式和正文解析器来处理它: 问题是在接收端我无法检索我正在寻找的json数据。有人知道我错过了什么吗?

  • MVC 是很多应用开发时都会采用的一种「架构模式」,会把一个应用分成 Model-View-Controller,每一部分各自负责: Model - 应用的功能实现、数据库相关操作等 Controller - 负责转发请求,对请求进行处理等 View - 应用的界面部分,与用户的交互等 同样的,我们在开发Express应用的时候也可以采取这样的清晰明了的开发模式,所以我们可以先构建好应用的文件目录

  • Express 堪称是 Node.js 领域最为流行的Web开发框架,由著名的开发者 TJ 开发,现在已经衍生到4.x版本。 Express的”Hello World” 以下是一个简单的使用 Express 作为服务器的代码,通过 res.send() 方法将 Hello World 字符串作为 Response 返回: var express = require('express'); var

  • 在第三章中,我们将会学习如何使用最为流行的 Node.js Web开发框架 — Epxress 开发一个小型的站点,并包含了如何部署到服务器的章节。 这部分的内容曾发布在我的个人博客上:Express开发Web应用,Express开发Web应用2。本章中将试图以更为清晰的语言讲解整个开发、部署的过程。 整个网站的代码库开源于:github.com/SFantasy/Riki。

  • 我已经掌握了XPath的基本知识,但在确定以下内容是否可以在使用XPath的C代码中实现时遇到了一些困难(或者我是否需要将其转移到其他代码中,正如我目前所做的那样)。 我有一个XML文档,它由以下结构组成: 其中有多个设置参数值。现在我需要做的只是检索那些包含name属性某些值的setParameter节点。我可能有这些值的可能匹配列表,但它们不会是完全匹配,它们将是节点的name属性必须包含的值