2011-03-03 15 views
5

Estoy tratando de ejecutar una aplicación simple de screen scraping en node.js. El código está publicada aquí: https://github.com/anismiles/jsdom-based-screen-scraper http://anismiles.wordpress.com/2010/11/29/node-js-and-jquery-to-scrape-websites/error de Strange node.js: TypeError: Object # <Object> no tiene el método 'on'

El servidor arranca bien, pero luego cuando ejecuta una consulta en él, me sale el siguiente error. ¿Alguien sabe por qué es eso?

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) 

La función que parece estar lanzando el error es:

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)); 

    }); 
} 

ACTUALIZACIÓN

Ahora me di cuenta de que en la primera solicitud, me sale esto:

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) 

Respuesta

1

razón fundamental detrás de este error debe ser algo que ver con EventEmittter. permítanme explicar,

  1. searcher.js hereda de EventEmitter (Line-26) Searcher.prototype = new process.EventEmitter;

  2. searcher-rediff.js, searcher-flipkart.js y searcher-landmarkonthenet.js se extienden desde searcher.js, por lo que también heredan de EventEmitter.

  3. El método 'on' está realmente definido en EventEmitter.

Por lo tanto, creo que, por alguna razón, searcher.js no es capaz de heredar de EventEmitter y por lo tanto el método de ‘on’ no se encuentra.

+0

Ya veo ... Entonces, ¿cómo lo hago para que searcher.js _is_ pueda heredar de EventEmitter? – Avishai

2

La única explicación que viene a la mente es que la requerida módulo no es una instancia de EventEmmiter. Por lo tanto, no tiene un método 'encendido'.

0

Está intentando configurar un escucha en un módulo en lugar de un EventEmitter.

require('./searcher-rediff'); devuelve un módulo de Javascript. Imagino que en realidad hay un objeto en el módulo searcher-rediff que es el EventEmitter que está buscando.

Mire a través del código searcher-rediff.js para ver dónde se define y exporta un EventEmitter, entonces deberá hacer referencia a eso.

Al final, usted probablemente va a terminar con algo como ...

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