【问题标题】:Why does Google Cloud Function run a global function multiple times after deploy?为什么 Google Cloud Function 在部署后会多次运行全局函数?
【发布时间】:2017-11-17 23:05:30
【问题描述】:

我设置了多个触发器,比如:

exports.doSomething = functions.firestore.document('col/{doc}').onCreate(event => {})

比我有一个我想在部署时立即运行的功能。看起来像这样:

now()
function now(){
    console.log("running function")
}

我在我的日志中得到了这个:

为什么它运行了这么多次并被其他函数调用?

完整代码,刚刚测试过,运行函数被调用了 4 次,与我设置的触发器数量相同:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore()
var geoip = require('geoip-lite');

exports.z = functions.firestore.document('converasdassdtIP/{UID}').onCreate(event => { })
exports.x = functions.firestore.document('sads/{UID}').onCreate(event => { })
exports.n = functions.firestore.document('asdasasdsa/{UID}').onCreate(event => { })
exports.m = functions.firestore.document('converasdasddtIP/{UID}').onCreate(event => { })

now()
function now(){
    console.log("running function")
}

【问题讨论】:

  • 您在代码中的哪个位置调用now()?您可以将您的一些functions/index.js 添加到问题中吗?
  • @Callam 查看我的编辑
  • 每次触发函数时都会调用您对now() 的调用,因为它位于index.js 文件的根范围内,因此每个运行的云函数都会看到此日志。你想用这个日志实现什么?您希望它何时打印?
  • @Callam O,我对 javascript 非常不熟悉。假设我想在每次将某些东西部署到 Firebase 时进行一次设置,我应该怎么做/怎么做?我希望函数 now() 只运行一次。
  • 你什么时候只在部署时运行它?您要部署什么,所有功能,还是仅部署一个特定功能?

标签: javascript firebase google-cloud-functions


【解决方案1】:

Cloud Functions 不提供在部署时运行一些代码的方法。您的函数显然运行了多次,并且您应该期望它会运行更多次,因为新的服务器实例会随着项目的负载而被分配(和销毁)。这就是 Cloud Functions 的扩展方式。绝对不只有一个服务器实例处理您的所有请求。您应该期望任何全局代码都会重复运行。

如果您想在部署后只运行一次代码,请制作一个导出的函数(可能是 HTTPS)并在部署后触发它。也许您可以编写一个脚本来部署您的代码,然后使用 curl 或您选择的其他机制触发函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2020-10-20
    • 1970-01-01
    • 2017-08-04
    • 2023-03-17
    相关资源
    最近更新 更多