【发布时间】:2016-07-01 16:31:44
【问题描述】:
我一直致力于将 Google Recaptcha 集成到 Meteor 和 AngularJS 网络应用程序中。一切都很顺利,直到我不得不验证 recaptcha 响应——由于某种奇怪的原因,我无法从后端获得异步响应到前端。
我尝试了很多不同的变体,并且阅读了很多关于 SO 和一般互联网的帖子,但没有运气 - 所以我选择发布我自己的问题。
这就是我正在做的事情:
客户:
Meteor.call('recaptcha.methods.validateRecaptcha', { 'response' : this.recaptcha.getResponse(this.id) }, function(error, result) {
// error and result are both undefined
console.log('Do something with the ' + error + ' or ' + result + '.');
}
所以,我正在调用一个 Meteor 方法并传入一个在方法完成时运行的回调。但是,error 和 result 参数都是未定义的。
服务器:
run: function(data) {
if (this.isSimulation) {
/*
* Client-side simulations won't have access to any of the
* Meteor.settings.private variables, so we should just stop here.
*/
return;
}
return Meteor.wrapAsync(HTTP.post)(_someUrl, _someOptions);
}
最后一行是我在几个 Meteor 指南中找到的同步/异步结构的缩短版本(我也尝试过这个版本),即:
var syncFunc = Meteor.wrapAsync(HTTP.post);
var result = syncFunc(Meteor.settings.private.grecaptcha.verifyUrl, _options);
return result;
我也尝试过使用 Futures 的版本:
var Future = Npm.require( 'fibers/future' );
var future = new Future();
var callback = future.resolver();
HTTP.post(Meteor.settings.private.grecaptcha.verifyUrl, _options, callback);
return future.wait();
现在,这里的意图是我使用Meteor.call()从客户端调用此方法,客户端存根运行(以防止模拟错误,因为我们在真正的非SO服务器中使用私有Meteor.settings变量-侧代码)并立即返回(发生),并且服务器在将结果返回给客户端(没有发生 - 回调发生但没有错误之前)点击 Google 的 Recaptcha API(发生并且服务器收到响应) /成功数据)。
我的想法是两种情况之一正在发生:
- 我只是做错了,我没有正确地将数据发送回客户端。
- 同步客户端存根(立即返回)告诉客户端服务器响应并不重要,因此它从不等待正确的异步响应。
是否有任何 Meteor 专家在这里发表意见,让我知道发生了什么以及如何让异步请求在 Meteor 应用程序中正常运行?
谢谢!
【问题讨论】:
-
能否请您在服务器端发布完整的 Meteor 方法?它不仅仅是
run: function (data) { ... }
标签: javascript angularjs node.js asynchronous meteor