поэтому я следил за этой серией руководств из 5 частей о том, как уведомления могут быть отправлены с устройства на устройство с помощью облачного хранилища Firebase, и написанный мной javascript кажется неправильным, потому что я продолжаю получать сообщение об ошибке «Каждый then () должен возвращать значение или бросить обещание / всегда-возврат ». Может кто-нибудь сказать мне, как мне это исправить?
index.js
'use-strict'
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) => {
var user_id = event.params.user_id;
var notification_id = event.params.notification_id;
//console.info("User ID: " + user_id + " | Notification ID : " + notification_id);
return admin.firestore().collection("Users").doc(user_id).collection("Notifications").doc(notification_id).get().then(queryResult => {
var from_user_id = queryResult.data().from;
var from_message = queryResult.data().message;
var from_data = admin.firestore().collection("").doc("from_user_id").get();
var to_data = admin.firestore().collection("Users").doc(user_id).get();
return Promise.all([from_data, to_data]).then(result => {
var from_name = result[0].data().name;
var to_name = result[1].data().name;
var token_id = result[1].data().token_id;
console.info("From: " + from_name + " | To : " + to_name);
var payload = {
notification : {
title : "Notification From : " + from_name,
body : from_message,
icon : default
}
};
return admin.messaging().sendToDevice(token_id, payload).then(result => {
console.info("Notification Sent");
});
});
});
});
Помимо указанной выше ошибки, я также получаю следующую ошибку "синтаксического анализа".
32:18 error Parsing error: Unexpected token default
первая «проблема» (предупреждение, я подумал) - console.info("Notification Sent");
не имеет возврата в этом .then
Вы используете зарезервированное ключевое слово default
, которое вы не можете использовать. Я предполагаю, что вы хотели представить это как строку, например. "default"
«Каждый then () должен возвращать значение или выдавать обещание / всегда-возврат»
Это означает, что один из ваших .then
не возвращает значение (или выдает ошибку)
Вот и виноват:
.then(result => {
console.info("Notification Sent");
});
Так что добавьте return
. Теперь, поскольку возвращаемое значение console.info
- undefined
, а в функции, не имеющей оператора возврата, подразумевается return undefined
.
Поэтому приведенный ниже код приводит к точно такому же поведению (например, return undefined
) и предотвращает появление этого предупреждающего сообщения.
.then(result => {
return console.info("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.info("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.info("Notification Sent");
});
});
Вышеуказанных ошибок сейчас не возникает. Но помимо этого появляется ошибка «Ошибка синтаксического анализа: неожиданный токен по умолчанию». Что для этого нужно сделать?
верно ... так что же ты думает о default
... что это значит для вас в этом коде? поскольку у вас не может быть переменной с именем default
, должна ли она быть "default"
, как я сделал в ответе?
Вторая проблема ...
default
- это зарезервированное слово в javascript (и все равно не определено в вашем коде)