2011-03-03 13 views
5

मैं node.js. में एक साधारण स्क्रीन स्क्रैपिंग ऐप चलाने की कोशिश कर रहा हूं। कोड यहाँ पोस्ट किया जाता है: https://github.com/anismiles/jsdom-based-screen-scraper http://anismiles.wordpress.com/2010/11/29/node-js-and-jquery-to-scrape-websites/अजीब node.js त्रुटि: TypeError: ऑब्जेक्ट # <Object> पर कोई तरीका नहीं है '

सर्वर ठीक शुरू होता है, लेकिन फिर जब मैं उस पर एक क्वेरी चलाने, मैं निम्नलिखित त्रुटि मिलती है। क्या किसी को पता है कि वह क्यों है?

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) 

उत्तर

1

इस बग के पीछे मूल कारण EventEmittter के साथ कुछ किया जाना चाहिए। मुझे समझाती हूँ,

  1. searcher.js EventEmitter (लाइन-26) Searcher.prototype = नए process.EventEmitter से विरासत;

  2. खोजकर्ता-rediff.js, खोजकर्ता-flipkart.js और खोजकर्ता-landmarkonthenet.js searcher.js से विस्तारित है, इसलिए वे EventEmitter से भी उत्तराधिकारी हैं।

  3. 'ऑन' विधि वास्तव में EventEmitter में परिभाषित किया गया है।

तो, मुझे लगता है कि, किसी कारण से, searcher.js EventEmitter से प्राप्त करना है और इसलिए 'चालू' विधि याद आ रही है सक्षम नहीं है।

+0

मैं देखता हूं ... तो मैं इसे कैसे बना सकता हूं ताकि searcher.js _is_ EventEmitter से प्राप्त करने में सक्षम हो? – Avishai

2

एकमात्र स्पष्टीकरण जो दिमाग में आता है वह यह है कि आवश्यक मॉड्यूल एक EventEmmiter उदाहरण नहीं है। इसलिए, इसमें 'ऑन' विधि नहीं है।

0

आप EventEmitter की बजाय मॉड्यूल पर श्रोता सेट अप करने का प्रयास कर रहे हैं।

require('./searcher-rediff'); एक जावास्क्रिप्ट मॉड्यूल देता है। मुझे लगता है कि वास्तव में searcher-rediff मॉड्यूल में एक ऑब्जेक्ट है जो EventEmitter है जिसे आप ढूंढ रहे हैं।

searcher-rediff.js कोड को देखने के लिए देखें कि कोई ईवेंटइमीटर परिभाषित और निर्यात किया गया है, तो आपको इसका संदर्भ देना होगा।

अंत आप शायद कुछ तरह के साथ खत्म हो जाएगा में ...

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