【问题标题】:Strange node.js error: TypeError: Object #<Object> has no method 'on'奇怪的 node.js 错误:TypeError: Object #<Object> has no method 'on'
【发布时间】:2011-07-08 08:45:27
【问题描述】:

我正在尝试在 node.js 中运行一个简单的屏幕抓取应用程序。代码贴在这里: https://github.com/anismiles/jsdom-based-screen-scraper http://anismiles.wordpress.com/2010/11/29/node-js-and-jquery-to-scrape-websites/

服务器启动正常,但是当我对其运行查询时,出现以下错误。有谁知道这是为什么?

TypeError: Object #<Object> has no method 'on'
    at Object.<anonymous> (/Users/avishai/Downloads/anismiles-jsdom-based-screen-scraper-f0c79d3/searcher-server.js:9:10)
    at param (/Users/avishai/.node_libraries/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21)
    at param (/Users/avishai/.node_libraries/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:157:15)
    at pass (/Users/avishai/.node_libraries/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:162:10)
    at Object.router [as handle] (/Users/avishai/.node_libraries/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:168:6)
    at next (/Users/avishai/.node_libraries/.npm/connect/0.5.10/package/lib/connect/index.js:218:15)
    at Server.handle (/Users/avishai/.node_libraries/.npm/connect/0.5.10/package/lib/connect/index.js:231:3)
    at Server.emit (events.js:45:17)
    at HTTPParser.onIncoming (http.js:1078:12)
    at HTTPParser.onHeadersComplete (http.js:87:31)

似乎引发错误的函数是:

function books(app){
    app.get('/:query', function(req, res, next) {

        res.writeHead(200, { 'Content-Type': 'text/html' });

        var rediff = require('./searcher-rediff');
        rediff.on('on_book', function(item){
            res.write(item + "<br/>");
        });
        rediff.on('completed', function(){
            res.end();
        });
        rediff.search(escape(req.params.query));

    });
}

更新

现在我注意到,在第一个请求中,我得到了这个:

SyntaxError: Unexpected strict mode reserved word
    at Module._compile (module.js:369:25)
    at Object..js (module.js:380:10)
    at Module.load (module.js:306:31)
    at Function._load (module.js:272:10)
    at require (module.js:318:19)
    at Object.<anonymous> (/Users/avishai/Downloads/anismiles-jsdom-based-screen-scraper-f0c79d3/searcher.js:2:15)
    at Module._compile (module.js:374:26)
    at Object..js (module.js:380:10)
    at Module.load (module.js:306:31)
    at Function._load (module.js:272:10)

【问题讨论】:

    标签: javascript node.js screen-scraping connect


    【解决方案1】:

    唯一想到的解释是所需的模块不是 EventEmmiter 实例。因此,它没有“on”方法。

    【讨论】:

      【解决方案2】:

      这个错误背后的根本原因应该与EventEmittter有关。请允许我解释一下,

      1. searcher.js 继承自 EventEmitter (第 26 行)Searcher.prototype = new process.EventEmitter;

      2. searcher-rediff.jssearcher-flipkart.jssearcher-landmarkonthenet.js 扩展自 searcher.js,因此它们也继承自 EventEmitter

      3. ‘on’方法其实是在EventEmitter中定义的。

      所以,我认为,出于某种原因,searcher.js 无法从 EventEmitter 继承,因此缺少“on”方法。

      【讨论】:

      • 我明白了...那么我该如何让 searcher.js 能够从 EventEmitter 继承?
      【解决方案3】:

      您正在尝试在模块而不是 EventEmitter 上设置侦听器。

      require('./searcher-rediff'); 返回一个 Javascript 模块。我想searcher-rediff 模块中实际上有一个对象是您正在寻找的 EventEmitter。

      查看 searcher-rediff.js 代码以查看 EventEmitter 的定义和导出位置,然后您需要引用它。

      最后你可能会得到类似...

       var rediff = require('./searcher-rediff').searcher;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多