Return 使用 firebase-queue 的任务结果
Return task results using firebase-queue
我正在使用 Firebase 开发移动应用程序。在移动应用程序中,我需要根据类似于 Whatsapp 的 his/her 手机号码注册用户。我打算使用 Nexmo 来验证用户的手机号码。验证号码涉及两个步骤。
- 将用户的手机号码发送到 Nexmo API,它会 return 成功返回 request_id,它还会通过短信向用户的手机发送代码
- 将代码和 request_id 发送到 Nexmo 以验证号码
我想使用 firebase-queue 来执行这些任务。我想问一下是否有办法将任务的 return 结果返回给客户端。我在 firebase-queue 文档中没有看到任何这样的例子。基本上,我想添加一个任务来将手机号码发送到 Nexmo API 并希望获得 request_id 作为响应,以便我可以添加另一个任务来验证用户输入的代码。
肯定有办法将响应返回给客户端。我们在 Flashlight search integration:
中有一个很好的例子
function doSearch(index, type, query) {
var ref = new Firebase(URL+'/search');
var key = ref.child('request').push({ index: index, type: type, query: query }).key();
console.log('search', key, { index: index, type: type, query: query });
ref.child('response/'+key).on('value', showResults);
}
此代码在客户端 JavaScript 应用程序中运行,并在调用 push()
的行中将搜索词发送到服务器。然后它 "waits" 返回函数最后一行的响应。这里的关键是它使用用于发送请求的 sam push id/key 来监听响应。这样请求和响应就匹配了。
虽然 Firebase Queue 没有对此类 "handshake" 的内置支持,但您可以轻松地将其构建到您应用的客户端和服务器代码中。添加任务时,添加一个请求 ID(来自 the firebase-queue sample 的适配器):
var request_id = ref.push().key();
ref.child('queue/tasks').push({ requestId: request_id, foo: 'bar' });
在您的任务工作者中,您执行常规处理,然后使用相同的请求 ID(来自 firebase-queue sample 的适配器)将响应写回数据库:
var ref = new Firebase('https://<your-firebase>.firebaseio.com/queue');
var responses = new Firebase('https://<your-firebase>.firebaseio.com/responses');
var queue = new Queue(ref, function(data, progress, resolve, reject) {
// Read and process task data
console.log(data);
// Do some work
progress(50);
// Finish the task asynchronously
setTimeout(function() {
// write the response to the client
responses.child(data.requestId).set({ allDone: true });
// tell firebase-queue that we're done
resolve();
}, 1000);
});
对象中不需要写requestId。相反,您可以使用以下代码对 return 进行响应。我觉得比较干净
在客户端:
ref.child('queue/tasks').push({foo:'bar'});
诀窍是不清理输入。在服务器端:
var options = {sanitize:false};
queue = new Queue(firebaseQueueRef, options , function(request, progress, resolve, reject){
//do some work
setTimeout(function(){
resposeRef.child(request._id).set(myResponse);
resolve();
}
});
我正在使用 Firebase 开发移动应用程序。在移动应用程序中,我需要根据类似于 Whatsapp 的 his/her 手机号码注册用户。我打算使用 Nexmo 来验证用户的手机号码。验证号码涉及两个步骤。
- 将用户的手机号码发送到 Nexmo API,它会 return 成功返回 request_id,它还会通过短信向用户的手机发送代码
- 将代码和 request_id 发送到 Nexmo 以验证号码
我想使用 firebase-queue 来执行这些任务。我想问一下是否有办法将任务的 return 结果返回给客户端。我在 firebase-queue 文档中没有看到任何这样的例子。基本上,我想添加一个任务来将手机号码发送到 Nexmo API 并希望获得 request_id 作为响应,以便我可以添加另一个任务来验证用户输入的代码。
肯定有办法将响应返回给客户端。我们在 Flashlight search integration:
中有一个很好的例子 function doSearch(index, type, query) {
var ref = new Firebase(URL+'/search');
var key = ref.child('request').push({ index: index, type: type, query: query }).key();
console.log('search', key, { index: index, type: type, query: query });
ref.child('response/'+key).on('value', showResults);
}
此代码在客户端 JavaScript 应用程序中运行,并在调用 push()
的行中将搜索词发送到服务器。然后它 "waits" 返回函数最后一行的响应。这里的关键是它使用用于发送请求的 sam push id/key 来监听响应。这样请求和响应就匹配了。
虽然 Firebase Queue 没有对此类 "handshake" 的内置支持,但您可以轻松地将其构建到您应用的客户端和服务器代码中。添加任务时,添加一个请求 ID(来自 the firebase-queue sample 的适配器):
var request_id = ref.push().key();
ref.child('queue/tasks').push({ requestId: request_id, foo: 'bar' });
在您的任务工作者中,您执行常规处理,然后使用相同的请求 ID(来自 firebase-queue sample 的适配器)将响应写回数据库:
var ref = new Firebase('https://<your-firebase>.firebaseio.com/queue');
var responses = new Firebase('https://<your-firebase>.firebaseio.com/responses');
var queue = new Queue(ref, function(data, progress, resolve, reject) {
// Read and process task data
console.log(data);
// Do some work
progress(50);
// Finish the task asynchronously
setTimeout(function() {
// write the response to the client
responses.child(data.requestId).set({ allDone: true });
// tell firebase-queue that we're done
resolve();
}, 1000);
});
对象中不需要写requestId。相反,您可以使用以下代码对 return 进行响应。我觉得比较干净
在客户端: ref.child('queue/tasks').push({foo:'bar'});
诀窍是不清理输入。在服务器端:
var options = {sanitize:false};
queue = new Queue(firebaseQueueRef, options , function(request, progress, resolve, reject){
//do some work
setTimeout(function(){
resposeRef.child(request._id).set(myResponse);
resolve();
}
});