3

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

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

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

4

2 回答 2

7

肯定有一种方法可以将响应返回给客户端。我们在Flashlight 搜索集成中有一个很好的例子:

  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(来自firebase-queue 示例的适配器):

var request_id = ref.push().key();
ref.child('queue/tasks').push({ requestId: request_id, foo: 'bar' });

在您的任务工作者中,您执行通常的处理,然后使用相同的请求 ID(来自firebase-queue 示例的适配器)将响应写回数据库:

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);
});
于 2016-04-05T13:28:23.307 回答
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();
   }
});
于 2016-10-13T05:44:59.017 回答