"Каждое then () должно возвращать значение или выдавать обещание / всегда возвращать"
Это указывает на то, что один из ваших .then
не возвращает значение (или выведите ошибку)
Вот виновник:
.then(result => {
console.log("Notification Sent");
});
Так что добавьте return
.Теперь, поскольку console.log
возвращаемое значение равно undefined
, а в функции, не имеющей оператора return, подразумевается return undefined
Поэтому приведенный ниже код приводит к точно такому же поведению (то есть return undefined
), ипредотвратит это предупреждающее сообщение
.then(result => {
return console.log("Notification Sent");
});
Что касается вашей ошибки относительно default
, то это просто потому, что default
является зарезервированным словом в javascript (и оно даже не объявлено в вашем коде в любом случае) - это какпытаюсь использовать if
или while
в качестве имени переменной
Еще одна потенциальная проблема, которую я вижу в вашем коде:
var from_user_id = queryResult.data().from;
var from_message = queryResult.data().message;
//*** vvvvvvvvvvvvvv
var from_data = admin.firestore().collection("").doc("from_user_id").get();
var to_data = admin.firestore().collection("Users").doc(user_id).get();
Если это .doc(from_user_id)
- в противном случае,в чем смысл var from_user_id = queryResult.data().from;
И, наконец, в стороне, я вижу, что вы вкладываете свои обещания, а не цепляете их.Одним из преимуществ обещаний является то, что вы можете избежать "пирамиды обратного вызова ада / гибели"
Ваш код может быть написан как ниже вместо этого, что позволяет избежать "пирамиды" -Есть также некоторые другие приемы ES6 / ES7 +, так что queryResult.data()
и to_data.data()
нужно вызывать только один раз
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotification = functions.firestore.document("Users/{user_id}/Notifications/{notification_id}").onWrite((event) => {
const user_id = event.params.user_id;
const notification_id = event.params.notification_id;
return admin.firestore().collection("Users").doc(user_id).collection("Notifications").doc(notification_id).get()
.then(queryResult => {
const {from:from_user_id, message:from_message} = queryResult.data();
const from_data = admin.firestore().collection("").doc(from_user_id).get();
const to_data = admin.firestore().collection("Users").doc(user_id).get();
return Promise.all([from_data, to_data, from_message]); // added from_message so it's available in the next .then
})
.then(([from_data, to_data, from_message]) => { // added from_message
const from_name = from_data.data().name;
const {name:to_name, token_id} = to_data.data();
console.log("From: " + from_name + " | To : " + to_name);
const payload = {
notification : {
title : "Notification From : " + from_name,
body : from_message,
icon : 'default'
}
};
return admin.messaging().sendToDevice(token_id, payload);
})
.then(result => {
return console.log("Notification Sent");
});
});