尝试在Firebase FireStore中创建函数时Javascript Promises错误

时间:2018-09-27 00:53:23

标签: javascript android firebase google-cloud-firestore

因此,我一直遵循这个由5部分组成的教程系列,内容涉及如何使用Firebase Cloud Storage在设备之间将通知发送到设备,而我编写的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.log("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.log("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.log("Notification Sent");
      });
    });
  });
});

除了上述错误之外,我还收到如下“解析”错误

32:18 error Parsing error: Unexpected token default

2 个答案:

答案 0 :(得分:1)

“每个then()应该返回一个值或抛出Promise /总是返回”

这表明您的.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中的保留字(无论如何它都没有在您的代码中声明)-就像尝试使用{{1} }或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)的意义是什么


最后,顺便说一句,我看到您正在嵌套您的诺言,而不是将它们链接在一起。 Promise的好处之一就是您可以避免“地狱/末日的回调金字塔”

您的代码可以像下面的 那样编写,从而避免了“金字塔”-还有一些其他ES6 / ES7 +技巧,因此var from_user_id = queryResult.data().from;queryResult.data()仅需要被叫一次

to_data.data()

答案 1 :(得分:-1)

您正在使用无法使用的保留关键字default。我想你打算将其表示为字符串,例如"default"