即使在客户端仅调用一次,我的云函数也会执行多次。
调用函数时的日志总是这样。
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)
})
我知道这里已经存在类似的问题,但是我找不到解决方案和相同的情况,因此我将其发布。 我怎样才能解决这个问题?至少在客户端,我确保只调用一次。
答案 0 :(得分:1)
请务必阅读Firebase callable type functions的文档。可调用函数必须将诺言与数据一起发送给客户端。现在,您的函数没有立即返回任何内容。鉴于此,任务甚至可能没有安排执行。
请仔细阅读可调用函数的文档,并花一些时间来学习promise的工作方式。您对返回承诺的内容进行的任何API调用(包括Cloud Tasks API)都应包含在对调用者的最终响应中。