Google Firebase 오류(정의되지 않은 함수가 반환됨, 예상 약속 또는 값)
파이어베이스로 서버를 개발하고 있습니다.
저는 유튜브에서 구글 개발자의 비디오를 복사했습니다.
잘 작동하지만 로그에 다음과 같은 오류가 있습니다.
함수가 정의되지 않은 상태로 반환되었습니다. 약속 또는 값이 필요합니다.
함수가 반환됨으로 표시됩니다.undefined
하지만 나는 만듭니다.function
답례로promise
세트
어떻게 해결해야 하나요?
function sanitize(s) {
var sanitizedText = s;
console.log('sanitize params: ', sanitizedText);
sanitizedText = sanitizedText.replace(/\bstupid\b/ig, "wonderful");
return sanitizedText;
}
exports.sanitizePost = functions.database
.ref('/posts/{pushId}')
.onWrite(event => {
const post = event.data.val();
if (post.sanitized) return;
console.log('Sanitizing new post', event.params.pushId);
console.log(post);
post.sanitized = true;
post.title = sanitize(post.title);
post.body = sanitize(post.body);
return event.data.ref.set(post);
})
난 파이어베이스 초보자야, Nodejs.
프랭크가 당신의 게시물에 대한 논평에서 지적했듯이, 경고를 생성하는 반환 성명은 다음과 같습니다.
if (post.sanitized) return;
더미 값(예: null, false, 0)을 반환하여 경고를 무시할 수 있습니다.값이 사용되지 않습니다.
이전 버전의 Cloud Functions는 값이 없는 반환문을 사용하여 함수가 종료되어도 불만이 없었습니다.그게 네가 보는 이유야return;
링크한 비디오와 설명서에 있습니다.Firebaser Frank van Pufeelen의 질문에 대한 논평은 변화가 이루어진 이유를 설명합니다.
경고를 제거하는 가장 간단한 방법은 프랭크가 제안한 대로 반환 값을 추가하는 것입니다.
if (post.sanitized) return 0;
또 다른 옵션은 트리거를 다음에서 변경하는 것입니다.onWrite()
로.onCreate()
그러면 게시물이 삭제되고 경고를 생성하는 검사가 필요하지 않을 때 이 기능이 호출되지 않습니다.
exports.sanitizePost = functions.database
.ref('/test/{pushId}')
.onCreate(event => { // <= changed from onWrite()
const post = event.data.val();
//if (post.sanitized) return; // <= no longer needed
console.log('Sanitizing new post', event.params.pushId);
console.log(post);
//post.sanitized = true; // <= not needed when trigger is onCreate()
post.title = sanitize(post.title);
post.body = sanitize(post.body);
return event.data.ref.set(post);
});
다음을 사용하여 문서를 읽으려고 할 때 동일한 오류가 발생했습니다..get()
그것은 약속을 돌려줍니다.
저는 파이어베이스 유튜브 공식 튜토리얼을 통해 이 오류를 해결하기 위해 코드의 약속 라인을 반환해야 한다는 것을 알게 되었습니다.튜토리얼 연동 동영상 4:18분 확인 [https://youtu.be/d9GrysWH1Lc ]
또한 참고로 튜토리얼 솔루션을 사용하게 된 것은 함수 로그에 유효한 값이 실제로 기록되었지만 결과가 정의되지 않았다고 오류가 표시되는 경우에도 함수가 닫힌 후에만 기록되었다는 것을 알게 되었을 때입니다.
@bob-snyder가 말한 것에 더하여, 당신의 문제는 당신이 돌아오는 것입니다.undefined
조건하에
if (post.sanitized) return;
프로그래밍할 때 일반적인 팁인 단일 종료 지점을 사용하는 것이 좋습니다.기사.
예
// code...
const SUCCESS_CODE = 0;
exports.sanitizePost = functions.database
.ref('/posts/{pushId}')
.onWrite(event => {
const post = event.data.val();
let response = Promise.resolve(SUCCESS_CODE);
if (!post.sanitized) {
console.log('Sanitizing new post', event.params.pushId);
console.log(post);
post.sanitized = true;
post.title = sanitize(post.title);
post.body = sanitize(post.body);
response = event.data.ref.set(post);
}
return response;
})
트리거 핸들러가 비동기 함수인 경우 명시적이지 않더라도 경고가 발생하지 않습니다.return
진술.
트리거 핸들러가 동기화 함수인 경우, 수락된 답변에서 제안된 것처럼 경고를 침묵시키기 위해 명시적인 반환 명령문이 필요합니다.
즉, 우리가 다시 쓴다면,
exports.updatePost = functions.firestore
.document("posts/{postId}")
.onUpdate(async (snap, context) => { /* async handler*/
...
});
로.
exports.updatePost = functions.firestore
.document("posts/{postId}")
.onUpdate((snap, context) => { /* sync handler*/
...
});
우리는 해야 합니다.return 0;
또는 동기 핸들러 내부에서 유사합니다.
어떤 경우든 비동기의 경우 공식 문서에 조언된 대로 비동기 처리기에 대한 약속을 명시적으로 반환하는 것이 좋을 것입니다.
JavaScript 약속을 반환하여 비동기 처리를 수행하는 함수("백그라운드 함수"라고도 함)를 해결합니다.
언급URL : https://stackoverflow.com/questions/47128440/google-firebase-errorfunction-returned-undefined-expected-promise-or-value
'sourcecode' 카테고리의 다른 글
여러 줄의 설명 해결 방법? (0) | 2023.06.12 |
---|---|
기존 사용자 정의 테마를 사용하여 XML에서 활동의 제목 표시줄을 숨기는 방법 (0) | 2023.06.12 |
CSS - HTML 페이지 바닥글을 최소 높이로 페이지 하단에 유지하되 페이지와 겹치지 않도록 합니다. (0) | 2023.06.12 |
경골의 모든 행 표시/인쇄(tbl_df) (0) | 2023.06.12 |
출력 파일에 로그를 쓰는 중이 아닙니다. (0) | 2023.06.12 |