如何在jsdom中执行外部脚本

时间:2012-11-05 21:00:48

标签: javascript node.js jsdom

我在products.js文件中有一个方法,如下所示:

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

执行时,它告诉我“处理程序未定义”。我接近了吗?

2 个答案:

答案 0 :(得分: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
});

这听起来像个坏主意,为什么处理程序会变成全局?我认为你应该重组你的代码

答案 1 :(得分:0)

问题的背景是从现有网站抓取数据。我们希望为每个页面关联一个javascript scraper,并通过node.js服务器提供的URL访问已删除的数据。

正如Juan所说,关键是使用node.js模块。大部分的hander方法都是从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)}
});
}

这很有效。