我在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)
}
});
执行时,它告诉我“处理程序未定义”。我接近了吗?
答案 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)}
});
}
这很有效。