CasperJS将空POST数据发送到端点

时间:2014-07-09 01:53:28

标签: javascript casperjs

我正在使用CasperJS来抓取一个站点,构建一个JSON对象来组织所捕获的信息,然后将这样的JSON对象POST到一个ETL信息到数据库的服务(在PHP中)。

这就是问题,每当我尝试发送JSON对象时,对象都是空的,这是我用来发送信息的代码。

casper.then(function(){
    var productDetails = {};
    this.each(products,function(self, product){
        self.thenOpen(product, function(a){
            productDetails = this.evaluate(getProductDetails);
        });
        self.thenOpen('http://localhost.endpoint.lan/saveScrapingData.php', {
            method:'post',
            data: {
                name:'Alan',
                info: productDetails
            },
            headers: {
                'Content-type': 'application/x-www-form-urlencoded'
            }
        });
    });
});

问题是productDetails被发送为空,我不知道为什么,因为如果我console.log此时变量:

self.thenOpen(product, function(a){
    productDetails = this.evaluate(getProductDetails);
});

变量不是空的,很可能这是一个竞赛条件。变量在包含任何数据之前发送,但我不明白为什么会发生这种情况,如果我在确定变量包含数据后发送数据。

1 个答案:

答案 0 :(得分:2)

是的,在致电thenOpen时,productDetails变量仍未定义。您可以将thenOpen来电分成thenopen,以便在实际调用open时定义。

self.then(function(){
    this.open('http://localhost.endpoint.lan/saveScrapingData.php', {
        method:'post',
        data: {
            name:'Alan',
            info: productDetails
        },
        headers: {
            'Content-type': 'application/x-www-form-urlencoded'
        }
    });
});

这是因为casper步骤的异步方式(then*wait*)。它们已预定但稍后执行。问题是,通过使用设置对象调用thenOpen会将productDetails的值修复为undefined,因为上一步尚未执行。