2012-11-05 71 views
0

執行外部腳本我有一個products.js文件的方法,像這樣:如何jsdom

var handler = function(errors, window) {...} 

,想一個jsdom ENV回調中執行它:

jsdom.env({ 
    html : "http://dev.mysite.com:3000/products.html", 
    scripts : [ "http://code.jquery.com/jquery.js", "page-scrapers/products.js" ], 
    done : function(errors, window) { 
     handler(errors, window) 
     } 
}); 

執行時,它會告訴我'處理程序未定義'。我靠近嗎?

回答

0

問題的背景是從現有的網站上刮取數據。我們希望爲每個頁面關聯一個JavaScript刮取器,並通過通過node.js服務器提供的URL訪問刮取的數據。

正如Juan所建議的,關鍵是使用node.js模塊。的處理程序方法中的大部分從product.js導出:

exports.handler = function(errors, window, resp) {... 

然後導入在基於的node.js服務器實例:

//note: subdir paths must start with './' : 
var products = require('./page-scrapers/products.js'); 

這創建按名稱的方法的參考' products.handler',然後可以在請求處理程序中調用:

var router = new director.http.Router({ 
'/floop' : { 
    get : funkyFunc 
} 
}) 

var funkyFunc = function() { 
var resp = this.res 

jsdom.env({ 
    html : "http://dev.mySite.com:3000/products.html", 
    scripts : [ "http://code.jquery.com/jquery.js"], 
    done : function(errors, window) {products.handler(errors, window, resp)} 
}); 
} 

而且工作。

0

如果您希望變量可以被另一個文件訪問,則必須將其導出。 http://nodejs.org/api/modules.html

//products.js 
exports.handler = function(window, error) {...} 

// another.file.js 
var products = require('products.js'); 
jsdom.env({ 
    html : "http://dev.mysite.com:3000/products.html", 
    scripts : [ "http://code.jquery.com/jquery.js", "page-scrapers/products.js" ], 
    // This can be simplified as follows 
    done : products.handler 
}); 

這聽起來像一個壞主意,雖然,爲什麼一個處理器被製作成一個全球性的?我認爲你應該重組你的代碼

+0

我想要一個JavaScript處理程序每​​頁請求,以便人們可以獨立處理處理程序。它僅適用於jsdom.env()方法。這樣做可能會有效率問題,禁止任何緩存。雖然這是所有正在執行的服務器端。 –

+0

@JeffLowery我還沒有聽說客戶端上的node.js;)我仍然不喜歡導出處理程序並使其成爲全局的想法。這往往導致意大利麪代碼 –

+0

模塊鏈接是有幫助的。我沒有看到如何使用這種機制是'全球',因爲每個出口變量的範圍由模塊名稱。 我會回答我的問題,也許你可以提供一些建設性的批評。 –