【问题标题】:Getting cal cancelled error in firebase cloud functions在 Firebase 云功能中获取 cal 取消错误
【发布时间】:2021-10-26 18:21:29
【问题描述】:

Firebase 云函数有时会记录“错误:1 CANCELLED:呼叫已取消”。我试图在时间戳前一天发送推送通知,一切正常,直到获得 fcm 令牌但无法在此处发送通知是我的代码。

const NotificationLive_dayBefore = async () => {
try {
    const path = models.payments.firebasePath;
    let imageURL = null;
    let tokens = [];
    let subscribedUsers = await getSubscribedUsers().catch(e => { console.log(e) });
    if (subscribedUsers && subscribedUsers.length > 0) {
        for(const subscriber of subscribedUsers){
            const userDoc = db
                .collection('Payments').doc('v1').collection('users')
                .doc(subscriber)
                .collection('subscriptions').where('deleted_at', '==', null)
                .get() // <------------here is the error according to logs
                .then(async (snapshot) => {
                    if (!snapshot.empty) {
                        console.log('snapshot.empty', snapshot.empty);
                        for(const doc of snapshot.docs ){
                            // let friend_doc_id = doc.data().friend_doc_id
                            console.log("Friend id", doc.id);
                            
                            if (doc.exists) {
                                let oneDay = new Date().getTime() + (24 * 60 * 60 * 1000);
                                let oneDayMinus1 = new Date().getTime() + (23 * 60 * 60 * 1000);
                                console.log(oneDayMinus1);
                                console.log(oneDay);
                                try {
                                    let liveLesson = await db
                                        .collection('Lessons').doc('v1').collection('friends')
                                        .doc(doc.id)
                                        .collection('live')
                                        .where('start_time', '>', new Date(oneDayMinus1))
                                        .where('start_time', '<', new Date(oneDay))
                                        .where('deleted_at', '==', null)
                                        .get();

                                    for( const liveSnap of liveLesson.docs){
                                        console.log("liveSnapid", '=>', liveSnap.data());
                                        console.log('Private lesson exists', liveSnap.exists);
                                        if (liveSnap.exists) {
                                            // time is equal send notification
                                            console.log("Subscriber ID", subscriber);
                                            const Users = db
                                                .collection(models.notification.firebasePath)
                                                .where('deleted_at', '==', null)
                                                .where('__name__', '==', subscriber)
                                                .get()
                                                .then(async (UserSnapshot) => {
                                                    for( const userdoc of UserSnapshot.docs){
                                                      
                                                        const userdocument = userdoc.data();
                                                        if (userdocument.fcm_token) {
                                                           tokens = userdocument.fcm_token;
                                                        }
                                                        console.log('tokens',tokens);
                                                        if (tokens.length>0) {
                                                            try {
                                                                let live_lessons_images = await db
                                                                    .collection('Accounts').doc('v1').collection('friends')
                                                                    .doc(doc.id)
                                                                    .get();
                                                            
                                                                if (!live_lessons_images.data().image_url) {
                                                                    imageURL = null;
                                                                    console.log("Image not found");
                                                                } else {
                                                                    imageURL = live_lessons_images.data().image_url;
                                                                }
                                                            } catch (error) {
                                                                console.log('That did not go well.', error)
                                                            }
                                                            console.log("notification sent live lesson 24 hr before");
                                                            await sendNotificationNew(
                                                                "test",
                                                                test notification,
                                                                imageURL,
                                                                tokens
                                                            ).catch(error => { console.error("promise 1", error) });; //send notification to users as a remainder for live lesson before one day
                                                        }
                                                    }
                                                }).catch(error => { console.error("promise 1", error) });
                                        }
                                    }
                                } catch (error) {
                                    console.log('That did not go well.', error)
                                }
                            } else {
                                console.log("friend_doc_id is not present");
                            }
                        }
                    }
                }).catch(error => { console.error("promise error", error) });
        } //end foreach of subscribed user
    }
    return Promise.all('success');
}
catch (err) {
    // Handle error here
    // This will return error from api
    console.log("Exceptions: ", err);
}}

而我的 sendNotificationNew 函数是

const sendNotificationNew = async (title, body, image, tokens) => {
    console.log("title", title);
  if (tokens.length > 0) {
    if(tokens.length>1){
      tokens = tokens[tokens.length-1];
    }
    try {
      let message = {
        notification: {
          title: title,
          body: body
        },
        token: tokens
      };
     
      if (image) {
        message.notification.image = image;
      }
      admin.messaging().send(message)
        .then((response) => {
          // Response is a message ID string.
          console.log('Successfully sent message:', response);
        })
        .catch((error) => {
          console.log('Error sending message:', error);
          console.log('Error sending message:', tokens);
        });

    } catch (err) {
      console.log(err);
    }
  } else {
    console.log("Token not available");
  }
};

我能够看到打印通知“标题”的日志,但看不到“成功发送消息”或“发送消息错误:”。

我收到的错误消息

Error: 1 CANCELLED: Call cancelled
at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31)
at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:327)
at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:299)
at (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:145)
at processTicksAndRejections (internal/process/task_queues.js:79)

还有这个

Error: 9 FAILED_PRECONDITION: The requested snapshot version is too old.
at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31)
at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:327)
at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:299)
at (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:145)
at processTicksAndRejections (internal/process/task_queues.js:79)

【问题讨论】:

  • 您的两个错误都显示抛出错误的相同行号。您可以查看这些文件或附上这些文件的屏幕截图,以便我进行更多检查。

标签: javascript node.js firebase google-cloud-functions


【解决方案1】:

我通过在 firestore 中添加索引和适当的 catch 块来解决这个问题,以避免未处理的拒绝错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2019-08-08
    • 2019-10-17
    • 2022-09-12
    • 2018-11-17
    • 2020-05-30
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多