在哪里放置 Firestore 触发器

Posted

技术标签:

【中文标题】在哪里放置 Firestore 触发器【英文标题】:where to put Firestore trigger 【发布时间】:2018-12-01 00:00:24 【问题描述】:

我想在我的项目中使用 Firestore DB 触发器,但它似乎不起作用。我使用 Express.js 作为路由器,函数是用 TypeScript 编写的。

./apiRouter.ts

import  test  from './controllers/test'

export let apiRouter = express.Router()

apiRouter.route('/test').post(test)

我创建了一个 test() 函数,它可以正确地在“城市”Firestore 集合中创建一个新的城市文档:

./controllers/test

import  adminApp  from '../adminApp'

export const test = async (request, response) => 

  try 
   const res = await adminApp.firestore().collection('cities')
      .doc('LA')
      .set(
        name: "Los Angeles",
        state: "CA",
        country: "USA"
      )

    response.status(200).send(res)
  
  catch (e) 
    // ...
  

然后我初始化 FB 管理应用程序并像这样编写“citiesOnCreate”触发器:

./adminApp.ts

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
...

export const adminApp = admin.initializeApp(
  credential: admin.credential.cert(serviceAccountKeyCasted),
  databaseURL: databaseUrl
)

export const citiesOnCreate = functions.firestore
  .document('cities/cityId')
  .onCreate((change, context) => 
    console.log('citiesOnCreate: ', change, context)
  );

因此,当我将一些数据发布到该“/test”API 端点时,它会在 Firestore 中创建新文档,但我无法让触发器运行。

编辑:我的 ./index.ts 看起来像这样:

import * as functions from 'firebase-functions'
import  apiRouter  from './apiRouter'
export  citiesOnCreate  from './adminApp'

export const api = functions.https.onRequest(apiRouter)

【问题讨论】:

【参考方案1】:

您的函数必须从部署的主入口点导出,通常是index.ts。现在,您正在从adminApp.ts 导出citiesOnCreate,并且从主入口点重新导出它并不清楚。我猜你不是。

【讨论】:

抱歉,我已在问题中添加了有关我的“index.ts”文件的附加信息。我想我正确地导出了它,还是我错过了什么? 好的,我还期待 console.log() 在我的本地主机上提供功能时出现在终端中。当我将功能部署到实时系统时,我可以在 Firebase 的“功能/日志”选项卡中看到日志,所以现在看起来可以正常工作了,谢谢

以上是关于在哪里放置 Firestore 触发器的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 触发器未在模拟器上运行

使用 Cloud Firestore 触发器功能时如何获取 dataID?

firestore更改不会触发

从 Cloud Functions for Firebase 中的 Firestore 触发器获取用户 ID?

如何在不使用index.js文件中的触发器功能的情况下从Firestore数据库读取数据?

云功能有时会在触发另一个云功能后写入 FireStore