Firebase Functions - admin.messaging().sendToTopic

2019-09-02 18:55发布

问题:

For some reason the then block of an admin function doesn't seem to be executing - I don't see any of the console.log messages in the firebase console:

Here is all of my firebase functions code:

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
const firebaseHelper = require('firebase-functions-helper');
const serviceAccount = require('./serviceAccountKey.json');
var toPlainObject = require('lodash.toplainobject');

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

//firebaseHelper.firebase.initializeApp(serviceAccount, 'https://snag-b2b2d.firebaseio.com');

//if (!admin.apps.length) {
admin.initializeApp();
admin.firestore().settings({timestampsInSnapshots: true});
var db = admin.firestore();

function renameObjectKey(oldObj, oldName, newName) {
    const newObj = {};

    console.log("in renameObjectKey");

    Object.keys(oldObj).forEach(key => {
        const value = oldObj[key];

        if (key === oldName) {
            newObj[newName] = value;
        } else {
            newObj[key] = value;
        }
    });

    return newObj;
}

class ParamsObject {
    constructor(value, tempId) {
        this.data = {message: value, tempId: tempId};
    }
}

exports.sendMessageNotification = functions.firestore.document('messages/{messageId}').onWrite((change, context) => {

        // Get an object representing the document
        // e.g. {'name': 'Marie', 'age': 66}
        const newValue = change.after.data();

        // ...or the previous value before this update
        const previousValue = change.before.data();

        console.log("newValue:", newValue);

        console.log("messageIdChange:", context.params.messageId);
        //console.log("prevValue:", previousValue);

        // access a particular field as you would any JS property
        //const name = newValue.name;

        var topic = 'all';

        let params = toPlainObject(new ParamsObject(newValue[context.params.messageId].message, newValue[context.params.messageId].timestamp));
        //params.data = toPlainObject(new WebObject());

        /*var payload = {
          data: {
            message: newValue.data.message
          }
        };*/

        admin.messaging().sendToTopic(topic, params).then((response) => {
          console.log("Successfully sent message:", response);
          //console.log("Message ID:", response.messageId);

          var newObj = renameObjectKey(newValue, newValue[context.params.messageId].timestamp, response.messageId);

          console.log("newObj:", newObj);

          firebaseHelper.firestore.updateDocument(db, 'messages', newValue[context.params.messageId].timestamp, newObj);
        }).catch((error) => {
          console.log("Error sending message:", error);
        });

        return null;
      });

The code that isn't being executed is inside a messaging function call - I receive the message so it is at least getting that far, but it doesn't seem to get into the then block:

admin.messaging().sendToTopic(topic, params).then((response) => {

          //*******DOESNT SEEM TO MAKE IT HERE*******

          console.log("Successfully sent message:", response);


          var newObj = renameObjectKey(newValue, newValue[context.params.messageId].timestamp, response.messageId);

          console.log("newObj:", newObj);

          firebaseHelper.firestore.updateDocument(db, 'messages', newValue[context.params.messageId].timestamp, newObj);
        }).catch((error) => {
          console.log("Error sending message:", error);
        });

This is all I see in the firebase functions log:

2:43:14.793 PM
sendMessageNotification
Function execution took 682 ms, finished with status: 'ok'
2:43:14.508 PM
sendMessageNotification
messageIdChange: 1537382591952
2:43:14.497 PM
sendMessageNotification
newValue: { '1537382591952': { message: 'The relay seems to be malfunctioning.', name: 'eamon', timestamp: '1537382591952' } }
2:43:14.112 PM
sendMessageNotification
Function execution started

I should also see the output from:

console.log("Successfully sent message:", response);

at least...

What is happening?

回答1:

You need to return a promise from your function that resolves when all the asynchronous work is complete. If you don't do that, Cloud Functions will terminate your function, possibly before the work is complete.

In your case, you should put a return keyword in front of admin.messaging()... instead of returning null.

Please read the documentation for more information, and watch my video series on dealing with promises in Cloud Functions.