由于某种原因,then
函数的admin
块似乎没有执行-我没有在console.log
中看到任何firebase console
消息:
这是我所有的firebase functions
代码:
// 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;
});
未执行的代码位于messaging
函数调用中-我收到消息,因此至少可以说到这一步了,但是似乎没有进入then
阻止:
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);
});
这是我在firebase functions
日志中看到的所有内容:
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
我还应该看到以下输出:
console.log("Successfully sent message:", response);
至少...
发生了什么事?
答案 0 :(得分:1)
您需要从函数中返回一个承诺,该承诺将在所有异步工作完成后进行解析。如果您不这样做,Cloud Functions可能会在工作完成之前终止您的功能。
在这种情况下,您应该在return
前面放置一个admin.messaging()...
关键字,而不要返回null。
请read the documentation以获取更多信息,以及watch my video series on dealing with promises in Cloud Functions。