Cloud Functions for Firebase 组织

Posted

技术标签:

【中文标题】Cloud Functions for Firebase 组织【英文标题】:Cloud Functions for Firebase organization 【发布时间】:2017-09-07 08:41:29 【问题描述】:

我知道这已经被问到here,但它没有回答我的问题。我的问题是我们如何为 Cloud Functions 分解 index.js,包括 onWrite 调用等。

我知道您可以使用“require”并引入外部代码。它仍然在 index.js 中留下一些代码(例如在 Franks OCR 中)。

理想情况下,我希望能够将整个 onWrite 事件触发器移动到另一个文件。

index.js 中的示例:

exports.sysQueueUserNew = functions.database.ref("/sys/queue/user_new/queueId").onWrite((event) => 
      // do something
)

如何将整个函数事件监视/调用移动到另一个 js 文件,并从 index.js 调用它?

我的 index.js 变得相当大,为了组织目的而阅读它已成为一种痛苦。

理想情况下,我希望我的 index.js 非常有条理,例如:

--in  index.js --
    /// User cleanup
    userHelpers()    

    /// SYS Logs
    sysLogs()

--and in userHelpers.js have the onWrite trigger for example---
   functions.database.ref("/sys/queue/user_new/queueId").onWrite((event) => 
      // create user
   )

等等……

是否可以不必像这样编写代码(以 Franks OCR 示例为例):

var test = require('./test')

exports.sysQueueUserNew = functions.database.ref("/sys/queue/user_new/queueId").onWrite((event) => 
      // do something
      test.doCleanup()
)

提前谢谢....

【问题讨论】:

你为什么不写另一个文件并在你的html中添加另一个脚本呢? 。加载完所有 JS 文件后,可以从任何其他 js 文件访问每个函数 因为这些是在其服务器上运行的 Firebase 云功能。有问题的索引文件被部署到他们的服务器上,数据库使用它来触发事件。 【参考方案1】:

您可以轻松地将函数分布在多个文件中。这是一个例子:

////////////// index.js

exports.sysQueueUserNew = require('./sys-queue-user-new');
exports.userCleanup = require('./user-cleanup');

///////////// sys-queue-user-new.js

const functions = require('firebase-functions');

module.exports = functions.database
  .ref("/sys/queue/user_new/queueId")
  .onWrite(e => 
    // do something
  );

///////////// user-cleanup.js

const functions = require('firebase-functions');

module.exports = functions.auth.user().onDelete(e => 
  // do something
);

【讨论】:

非常感谢您提供了一个很好的例子。我一定是做错了什么,因为我可以发誓我尝试过这种模式没有运气。我觉得自己像个白痴!谢谢! @Michael,通过这个设置,假​​设你在index.js 中初始化firebase-admin,就像const admin = require('firebase-admin'),你将如何将它传递给user-cleanup.js?因为admin只能初始化一次,但是需要在user-cleanup.js中使用 index.js 中初始化后,您可以只在其他文件中使用const admin = require('firebase-admin'),它已经被初始化了。 谢谢迈克尔,我发布了我最终做的作为你答案的变体。【参考方案2】:

作为迈克尔回答的一个变体,我发现这个组织非常整洁,而且是面向对象的。

// index.js
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

const user = require('./user')(admin)
exports.sendWelcomeEmail = user.sendWelcomeEmail

// user.js
const functions = require('firebase-functions')

module.exports = function(admin) 

    let sendWelcomeEmail = functions.auth.user().onCreate(event => 
        // return admin.database().ref().update()
    )

    return 
        sendWelcomeEmail: sendWelcomeEmail
    

【讨论】:

以上是关于Cloud Functions for Firebase 组织的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase Cloud Functions 测试中模拟 FCM admin.messaging().sendToDevice() 的实现

如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?

Cloud Functions for Firebase 超时

Cloud Functions for Firebase onWrite 超时

在 Cloud Functions for Firebase 中访问 db 数据

Cloud Functions for Firebase 组织