【发布时间】:2018-01-22 04:55:27
【问题描述】:
我想知道当我已经链接承诺并且如果出现问题我需要更新实时数据库时编写 node.js 代码的正确方法是什么?
代码如下:
export const testErrorHandling = functions.database
.ref('/workqueue/{pushId}/something').onWrite(event => {
// Exit when the data is deleted.
if (!event.data.exists()) {
return;
}
//This is the retry count, give up if more than 5 times have been retried.
const data = event.data.val()
if (data.count >= 5) {
return
}
return event.data.ref.root.child(data.fulluri).once('value').then(snapshot => {
//Process all, if ok, delete the work queue entry
return event.data.ref.remove()
}).catch(exception => {
console.log('Error!: ' + exception)
//Log error, increase retry count by one an write to that
//location to trigger a retry
//Is the line below OK?
//return event.data.ref.child('count').set(data.count + 1)
})
})
我猜这在许多情况下是常见的要求,但找不到示例,因为所有示例似乎都只是写入 console.error 并完成。 (这在现实世界中是不够的。)
【问题讨论】:
-
只有当您可以在代码中实际处理错误时,您才应该捕获它们。那么你认为会出现什么问题会触发捕获?你想怎么处理?
-
顺便说一句:目前无法在 Cloud Functions 中强制重试,但可能会在未来的版本中添加。
-
我们正在 AWS Lambda 上创建一个 PDF,将其写入 Cloud Storage,验证它是否正确写入并且可以打开,使用包含书面 PDF 作为附件的邮戳发送电子邮件并相应地更新数据.我们可能会为所有 https 调用等设置重试,但是工作量和测试量有点太多了。编写幂等代码要容易得多(无论如何实现重试,都必须如此),然后重试整个过程。因此,通常我们会看到服务出现故障、导致临时错误代码或最终导致对云存储的写入损坏
-
但此代码仅捕获写入数据库失败并尝试通过另一次写入数据库来发出信号。这种写入失败的最可能原因是网络连接问题。在这种情况下,第二次写入成功的机会非常小。
-
是的,这只是示例。在从 firebase 读取和使用链式 then 捕获之间大约有十次调用各种系统。如果有任何呼叫向南,我们需要重新排队并重试。如果 Firebase 不起作用,则链不会启动,也不会造成任何伤害。由于代码是幂等的,我们可以尝试任意多次。不重试的唯一原因是数据或我们的代码有问题,在这种情况下,在几次 cron 启动紧急运行后,它最终会出现在我们的人工工作队列中,这些紧急运行是为徘徊的条目计时的。
标签: node.js firebase google-cloud-functions