即使在客户端上调用一次,云函数也会多次执行

时间:2019-12-08 03:50:40

标签: javascript firebase google-cloud-functions

即使在客户端仅调用一次,我的云函数也会执行多次。

调用函数时的日志总是这样。

  

aFunction函数执行开始
  aFunction函数执行耗时388 ms,状态码为204
  aFunction函数执行开始
  aFunction函数执行耗时1106 ms,状态码为200
  未处理的拒绝
  错误:4 DEADLINE_EXCEEDED:超过了截止日期

     

at Object.callErrorFromStatus(/srv/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
      在Http2CallStream.call.on(/srv/node_modules/@grpc/grpc-js/build/src/client.js:96:33)
      在emitOne(events.js:121:20)
      在Http2CallStream.emit(events.js:211:7)
      在process.nextTick(/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:75:22)
      在_combinedTickCallback(内部/进程/next_tick.js:132:7)
      在process._tickDomainCallback(internal / process / next_tick.js:219:9)

这是客户端上的代码。

  callCloudFunction() {
    console.log('Function is called.')
    var functions = firebase.functions()
    var aFunction = functions.httpsCallable('aFunction')
    aFunction({
       ...
    })
  },    

功能是这样的。我要做的是按云功能添加云任务,然后该任务会触发其他云功能。

exports.aFunction = functions.https.onCall((data, context) => {
  const client = new tasks.CloudTasksClient()

  const projectId = functions.config()....
  const queue = 'name'
  const location = functions.config()....

  const parent = client.queuePath(projectId, location, queue)

  const url = 'https:// ... '.cloudfunctions.net/doSomething'

  const task = {
    httpRequest: {
      httpMethod: 'POST',
      url: url,
    },
    scheduleTime: {
      seconds: ...
    }, 
  }

  const request = {
    parent: parent,
    task: task,
  }

  client.createTask(request)
})    

我知道这里已经存在类似的问题,但是我找不到解决方案和相同的情况,因此我将其发布。 我怎样才能解决这个问题?至少在客户端,我确保只调用一次。

1 个答案:

答案 0 :(得分:1)

请务必阅读Firebase callable type functions的文档。可调用函数必须将诺言与数据一起发送给客户端。现在,您的函数没有立即返回任何内容。鉴于此,任务甚至可能没有安排执行。

请仔细阅读可调用函数的文档,并花一些时间来学习promise的工作方式。您对返回承诺的内容进行的任何API调用(包括Cloud Tasks API)都应包含在对调用者的最终响应中。