【问题标题】:Return task results using firebase-queue使用 firebase-queue 返回任务结果
【发布时间】:2016-10-13 13:44:59
【问题描述】:

我正在使用 Firebase 开发移动应用程序。在移动应用程序中,我需要根据他/她的手机号码注册一个用户,类似于 Whatsapp。我打算使用 Nexmo 来验证用户的手机号码。验证号码涉及两个步骤。

  1. 将用户手机号码发送至 Nexmo API,成功后返回 request_id,并通过 SMS 向用户手机发送代码
  2. 将代码和 request_id 发送到 Nexmo 以验证号码

我想使用 firebase-queue 来执行这些任务。我想问是否有办法将任务的结果返回给客户端。我在 firebase-queue 文档中没有看到任何这样的例子。基本上,我想添加一个任务来将手机号码发送到 Nexmo API,并希望得到 request_id 作为响应,以便我可以添加另一个任务来验证用户输入的代码。

【问题讨论】:

    标签: firebase firebase-queue


    【解决方案1】:

    肯定有一种方法可以将响应返回给客户端。我们在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() 的行中向服务器发送搜索词。然后它“等待”响应返回到函数的最后一行。这里的关键是它使用它用来发送请求的 sam push id/key 来监听响应。这样请求和响应就会匹配。

    虽然 Firebase Queue 没有对此类“握手”的内置支持,但您可以自己轻松地将其构建到应用的客户端和服务器代码中。添加任务时,添加请求 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);
    });
    

    【讨论】:

    • 感谢您的回复。我有点想我必须编写自己的逻辑才能将结果传回,但是您在 /responses/ 上发布结果的提示很简洁。
    • 请注意(我相信)“ref.child('response/'+key).on('value', showResults);”应该是“ref.child('responses/'+key).on('value', showResults);”与代码的其余部分保持一致。注意“响应”而不是“响应”。这主要是为未来的读者准备的,以防他们试图让它发挥作用。
    • 我刚刚实现了这个解决方案,但它让我想知道:所有响应节点会发生什么。谁删除它们?我们必须让客户删除它们吗?如果我授予客户端对响应节点的读/写访问权限,他(邪恶)能否以某种方式监听插入并在客户端监听它们之前将其删除?
    • 客户端应该只有/responses/$id的读取权限,而不是所有/responses。清理策略通常确实在客户端上,使用服务器端脚本清理旧的孤立响应。
    • 好的,我明白了,谢谢。它还回答了我的问题there。如果你愿意,你可以回答,我会推广它。
    【解决方案2】:

    您不需要在对象中写入requestId。相反,您可以使用以下代码返回响应。我觉得它更干净一些。

    在客户端: 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();
       }
    });
    

    【讨论】:

    • 我知道你在那里做了什么!干净!
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多