0

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

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

4

2 回答 2

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

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

于 2012-11-05T21:04:22.160 回答
0

问题的背景是从现有网站上抓取数据。我们希望为每个页面关联一个 javascript 抓取器,并通过 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)}
});
}

那行得通。

于 2012-11-05T22:20:12.513 回答