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

Cod*_*001 7 firebase google-cloud-functions google-cloud-firestore firebase-cli

当在本地 Firestore 和函数模拟器上运行我的 Firestore 触发器时,它们实际上不会触发。有时我让它们触发,但随后我做了一些小改变,一切都突然停止工作。

\n\n

我的模拟器在节点 8 上运行。与模拟器交互的代码在节点 12 上运行。我可以看出模拟器正在工作,因为当我多次运行测试代码时,我可以看到文档正在添加到集合中,但我的 onCreate 触发器从未运行。

\n\n

这是我的触发器:

\n\n
import * as functions from \'firebase-functions\';\n\nexport const charactersOnCreate = functions.firestore.document(\'characters\').onCreate(() => {\n    console.log(\'triggered\');\n})\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的测试代码:

\n\n
import * as dotenv from \'dotenv\';\nimport * as admin from \'firebase-admin\';\nimport * as path from \'path\';\nimport { credential } from \'../config\';\n\ndotenv.config({\n    path: path.join(__dirname, \'../../.env.test\')\n});\n\nconsole.log(process.env.FIRESTORE_EMULATOR_HOST);\n\nconst app = admin.initializeApp({ credential });\n\nconst db = app.firestore();\n\nconst runTest = async () => {\n    const charactersRef = db.collection(\'characters\');\n    const allCharacters = await charactersRef.get()\n    allCharacters.forEach(character => {\n        console.log(\'\\t\', character.id);\n    });\n    const userDoc = await db.collection(\'users\').doc();\n    console.log(userDoc.id);\n    await userDoc.set({\n        characters: []\n    });\n    const characterDoc = await db.collection(\'characters\').doc();\n    console.log(characterDoc.id);\n    await characterDoc.set({\n        ownerRef: userDoc\n    });\n    const userData = (await userDoc.get()).data();\n    const characterData = (await characterDoc.get()).data();\n    console.log(characterData);\n    console.log(userData);\n}\n\nrunTest().then(() => {\n    console.log(\'done\');\n}).catch((err) => {\n    console.error(err);\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是模拟器启动的输出:

\n\n
i  Starting emulators: ["functions","firestore"]\n\xe2\x9c\x94  functions: Using node@8 from host.\n\xe2\x9c\x94  functions: Emulator started at http://localhost:5001\ni  firestore: Logging to firestore-debug.log\n\xe2\x9c\x94  firestore: Emulator started at http://localhost:8080\ni  firestore: For testing set FIRESTORE_EMULATOR_HOST=localhost:8080\ni  functions: Watching "/Users/josh/Development/Projects/naturoll-api/functions" for Cloud Functions...\ni  functions: Setting up Cloud Firestore trigger "charactersOnCreate"\n\xe2\x9c\x94  functions: Trigger "charactersOnCreate" has been acknowledged by the Cloud Firestore emulator.\ni  functions: Setting up Cloud Firestore trigger "charactersOnUpdate"\n\xe2\x9c\x94  functions: Trigger "charactersOnUpdate" has been acknowledged by the Cloud Firestore emulator.\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的测试代码的输出:

\n\n
localhost:8080\n2DUPXO9J6yrzbOuoDPzw\nnfE7y8VhsoF5vxvHzHqA\n{ ownerRef: \n   DocumentReference {\n     _firestore: \n      Firestore {\n        _settings: [Object],\n        _settingsFrozen: true,\n        _serializer: [Object],\n        _projectId: \'naturoll-7b519\',\n        _lastSuccessfulRequest: 1563044750473,\n        _preferTransactions: false,\n        _clientPool: [Object] },\n     _path: ResourcePath { segments: [Array] } } }\n{ characters: [] }\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的 Firestore 日志:

\n\n
API endpoint: http://localhost:8080\nIf you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:\n\n   export FIRESTORE_EMULATOR_HOST=localhost:8080\n\nDev App Server is now running.\n\nJul 13, 2019 3:05:39 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\nJul 13, 2019 3:05:39 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected HTTP/2 connection.\nJul 13, 2019 3:05:40 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected non-HTTP/2 connection.\nJul 13, 2019 3:05:50 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead\nINFO: Detected HTTP/2 connection.\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不知道此时还能做什么。我不明白为什么触发器没有触发。当我再次运行测试代码时,之前创建的角色 ID 也会打印出来,因此 firestore 显然正在运行并接受数据。

\n

Cod*_*001 5

事实证明,即使您不使用通配符,也需要存在通配符才能触发触发器。

改变

export const charactersOnCreate = functions.firestore.document('characters').onCreate(() => {
Run Code Online (Sandbox Code Playgroud)

export const charactersOnCreate = functions.firestore.document('characters/{characterId}').onCreate(() => {
Run Code Online (Sandbox Code Playgroud)

解决了问题