CasperJS向端点发送空的POST数据
CasperJS sends empty POST data to endpoint
我使用CasperJS抓取一个站点,构建一个JSON对象来组织抓取的信息,然后将这样的JSON对象发布到一个服务(PHP),该服务将信息ETLs到数据库中。
这里的问题,每当我尝试发送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);
});
变量不是空的,很可能这是一个竞速条件。变量在包含任何数据之前被发送,但我不明白为什么会发生这种情况,如果我在确定变量包含数据之后发送数据。
是的,在调用thenOpen
时,productDetails
变量仍然未定义。您可以将thenOpen
调用拆分为then
和open
,以便在实际调用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
,因为前面的步骤尚未执行。
相关文章:
- 下载使用POST数据动态生成的文件
- 如何从HTTP上下文对象中获取Post数据
- 可以't通过Angular$resource POST数据
- 如何在IE CORS中发送POST数据(使用XDomainRequest)
- Angular js,在选择元素上,我想 POST 数据以将其保存在数据库中,然后我想使用 PUT 更新它而无需重新加载
- 追加 POST 数据 javascript
- Angular 中的 HTTP 服务将 POST 数据作为请求正文的键发送,没有值
- 从chrome扩展创建一个包含POST数据的链接
- 如何使用AJAX打印PHP POST数据?(没有jQuery)
- Javascript POST数据进入GET PHP数组
- PHP没有从$.ajax获取POST数据
- 为什么cgi-POST数据被篡改和截断
- Ajax XML的POST数据值发生更改
- POST数据没有'不包含任何表单数据
- firebug:如何在firebug控制台中发送POST数据
- IE11不发送HTTP POST数据
- 使用POST数据引用jsfiddle.net
- 保存每个POST数据的Chrome扩展
- 如何将PHP Post数据获取到jquery ajax请求中
- 如何在选择Select Box值时将参数作为POST数据传递,这将重新加载同一页面