执行异步云函数出现问题

问题描述 投票:0回答:2

我的数据库看起来像这样

enter image description here

我的云功能是

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

exports.userGotNewMessage = functions
.region(`europe-west1`)
.database
.ref(`user-messages/{userId}/{senderId}/{messageId}`)
.onCreate((snap, context) => {
  var userId = context.params.userId
  console.log(`Step 1  ${userId}`)
  var text = snap.val().text
  var toId = snap.val().toId
  var numberOfUnreadMessages = 0
  var db = admin.database()

  if (userId === toId) {
    console.log(`Step 2 ${userId}`)
  var unreadMessagesRef = db.ref(`unread-messages/${userId}`)
  unreadMessagesRef.on("value", (snap) => {
    snap.forEach((childNode) => {
      var nodeNumber = childNode.val().numberOfUnreadMessages
      numberOfUnreadMessages = numberOfUnreadMessages + nodeNumber
    })
    return console.log(`Found ${numberOfUnreadMessages} unread messages for ${userId}`)
  });

  console.log(`Step 3 ${userId}`)
  var token = 'dxfAkmce.....my testing device'
  console.log(text)
  var message = {
    "token": String(token),
    "data": {
      "count": `${numberOfUnreadMessages}`
    }
  }

  admin.messaging().send(message)
  .then((response) => {
    console.log(`Step 4 ${userId}`)
    // Response is a message ID string.
    return console.log('Successfully sent message:', response);
    // detailed information about result if send succeded but something went wrong
    // console.log(response.results[0].error);
  })
  .catch((error) => {
    return console.log('Error sending message:', error);
  });
  }
  console.log(`Step 5 ${userId}`)
  return null
});

使用此功能时我会得到奇怪的行为。发送消息后会计算未读消息的数量,例如,在启动后,我从任何地方收到有关已计算的未读消息的消息(数据库中根本没有 16 条消息))) 控制台中有这样的东西

3:05:23.627 PM userGotNewMessage 成功发送消息: 项目/chatapp-2e320/messages/1544015123460374

3:05:23.626 PM userGotNewMessage 第 4 步 VobaLy7AKMeYnGv7OgIokaeQ5UG2

3:05:23.340 PM userGotNewMessage 函数执行花费了 9 毫秒, 完成状态:“确定”

3:05:23.334 PM userGotNewMessage 步骤 5 nx9XfqgIqyS8PdZ8PzLQ9sEyKoV2

3:05:23.333 PM userGotNewMessage 步骤 1 nx9XfqgIqyS8PdZ8PzLQ9sEyKoV2

3:05:23.331 PM userGotNewMessage 函数执行开始

3:05:23.325 PM userGotNewMessage 函数执行花费了 151 毫秒, 完成状态:“确定”

3:05:23.317 PM userGotNewMessage 第 5 步 VobaLy7AKMeYnGv7OgIokaeQ5UG2

3:05:23.317 PM userGotNewMessage 再次问好

3:05:23.317 PM userGotNewMessage 第 3 步 VobaLy7AKMeYnGv7OgIokaeQ5UG2

3:05:23.317 PM userGotNewMessage 发现 1 条未读消息 VobaLy7AKMeYnGv7OgIokaeQ5UG2

3:05:23.234 PM userGotNewMessage 第 2 步 VobaLy7AKMeYnGv7OgIokaeQ5UG2

3:05:23.234 PM userGotNewMessage 第 1 步 VobaLy7AKMeYnGv7OgIokaeQ5UG2

3:05:23.182 PM userGotNewMessage 发现 16 条未读消息 VobaLy7AKMeYnGv7OgIokaeQ5UG2

3:05:23.175 PM userGotNewMessage 函数执行开始

我知道这是由异步工作引起的,但我无法自己修复它,因为我是一个完全的初学者。请帮我修复这个错误!!

swift firebase google-cloud-platform google-cloud-functions firebase-cloud-messaging
2个回答
1
投票

正如 @rijin 在他的回答中所说,您应该返回异步

send()
方法返回的承诺。但是,同样重要的是,您不应该在云函数结束时返回
null

通过返回

null
(这将在
send()
返回的承诺解决之前发生),您向云函数表明工作已完成。因此,换句话说,云函数会在异步作业完成之前停止执行。 此外,在云函数(其生命周期相对“短”)中使用

on()

监听器还不够。你最好使用

once()
方法。 
最后,您显然在云功能中实现了两个不同的业务逻辑部分,一部分用于报告大量未读消息,另一部分用于发送消息。您应该在两个不同的云函数中执行此操作,或者链接异步方法(即

once()

send()
方法)返回的不同 Promise。

因此,对于消息发送部分,执行以下操作应该可行:

exports.userGotNewMessage = functions .region(`europe-west1`) .database .ref(`user-messages/{userId}/{senderId}/{messageId}`) .onCreate((snap, context) => { var userId = context.params.userId console.log(`Step 1 ${userId}`) var text = snap.val().text var toId = snap.val().toId var numberOfUnreadMessages = 0 var db = admin.database() console.log(`Step 3 ${userId}`) var token = 'dxfAkmce.....my testing device' console.log(text) var message = { "token": String(token), "data": { "count": `${numberOfUnreadMessages}` } } return admin.messaging().send(message); });

如果您想在一个云函数中链接 
send()

once()
方法,您可以按照以下方式执行操作:

return admin.messaging().send(message) .then(messageID => { if (userId === toId) { var unreadMessagesRef = db.ref(`unread-messages/${userId}`); return unreadMessagesRef.once('value') .then(snap => { snap.forEach(childNode => { var nodeNumber = childNode.val().numberOfUnreadMessages; numberOfUnreadMessages = numberOfUnreadMessages + nodeNumber; }); console.log(`Found ${numberOfUnreadMessages} unread messages for ${userId}`); return null; }); } else { return null; } });



0
投票

return admin.messaging().send(message) .then((response) => { console.log(`Step 4 ${userId}`) // Response is a message ID string. return console.log('Successfully sent message:', response); // detailed information about result if send succeded but something went wrong // console.log(response.results[0].error); }) .catch((error) => { return console.log('Error sending message:', error); }); } console.log(`Step 5 ${userId}`)

	
© www.soinside.com 2019 - 2024. All rights reserved.