Firestore onUpdate 함수가 트리거되지 않음
문제
에뮬레이터와 함께 Firebase 클라우드 함수를 사용하고 있으며 어떤 이유로 onUpdate
트리거가 트리거되지 않지만 onCreate
함수가 트리거됩니다.
모든 코드는 TypeScript이며 클라우드 기능에서 작동하기 위해 JS로 변환됩니다.
// functions/src/music.ts
// this function runs
export const onMusicCreated = functions.firestore
.document('music/{musicId}')
.onCreate(async (snapshot) => {
console.log('on create is running')
})
// this function doesn't run
export const onMusicUpdated = functions.firestore
.document('music/{musicId}')
.onUpdate(async (change) => {
console.log('on update is running')
})
두 함수 모두 비동기 적입니다. 최종 코드에서는
프런트 엔드 add
에서 프런트 엔드에서 onCreate
함수를 실행 하면 함수가 실행됩니다.
const { id } = await firebase.firestore().collection('music').add({ title: 'hello world' })
콘솔 로그가 예상대로 실행되고 에뮬레이터가이를 콘솔에 출력합니다.
i functions: Beginning execution of "onMusicCreated"
i functions: Finished "onMusicCreated" in ~1s
그러나 동일한 문서를 업데이트하면 onUpdate
기능이 실행되지 않습니다.
// "id" is the same id as above
await firebase.firestore().doc(`music/${id}`).update({ title: 'new title' })
아무 반응이 없습니다. Firestore 에뮬레이터를 살펴보면 문서가 실제로 업데이트되었는지 확인할 수 있습니다. 나는 명백한 것을 놓치고 있습니까? 프론트 엔드 코드는 실제 사용에 비해 단순화되었지만 함수 코드는 전혀 단순화되지 않았습니다. 그리고 Firestore 문서가 예상대로 생성되고 업데이트되었는지 확인할 수 있습니다.
콘솔 또는 로그에 오류 메시지가 없습니다.
디버그 단계
- 함수 코드가 JS로 올바르게 트랜스 파일되었는지 확인했습니다. 코드 출력을 살펴보고 함수가 업데이트되었는지 확인하기 위해 onCreate 코드를 여러 번 업데이트했습니다.
- 위와 같이 함수 내부의 모든 코드를 비워서 함수 자체가 실행되고 있지 않은지 확인할 수 있습니다.
- onUpdate 함수는 기술적으로 두 개의 매개 변수를 허용합니다. 두 매개 변수 모두 동일한 결과입니다.
- 에뮬레이터로만 프로덕션에서 기능을 시도하지 않았습니다.
관련 게시물
firestore onWrite 트리거가 firebase 클라우드 함수 에뮬레이터에서 호출되지 않는 이유는 무엇입니까?
문서 선택기에 금지 된 문자를 사용하고 있지 않거나 적어도 해당 오류 메시지가 표시되지 않습니다.
Firestore 용 Firebase Cloud 함수가 트리거되지 않습니다.
3.11.0 함수를 사용하면 함수가 비동기이므로 암시 적으로 Promise를 반환해야합니다. 결과는 explicetely 값을 반환 할 때 (예를 들어, 동일 return 0
)
https://firebase.google.com/docs/functions/firestore-events#trigger_a_function_when_a_document_is_updated
그것이 공식 문서입니다. 내가 말할 수있는 한, 나는 문서가 말하는대로하고 있습니다. 그래도 눈부시게 분명한 것을 놓치고있을 수 있습니다.
그 외 세부 사항
- macOS Big Sur 11.1 (20C69)
- Firebase CLI 9.1.0
에뮬레이터가 최신 상태 여야합니다.
어떤 아이디어? 감사!
답변
onMusicUpdated
index.ts 함수 파일에서 가져 오는 것을 잊었습니다 . 따라서 에뮬레이터는 그것이 존재한다는 것을 결코 알지 못했습니다!
변경됨
// functions/src/index.ts
export { onMusicCreated } from './music'
...에
// functions/src/index.ts
export { onMusicCreated, onMusicUpdated } from './music'