首页 > 解决方案 > TypeError:无法读取未定义错误的属性“来自”

问题描述

我正在尝试制作一个 Firebase 推送通知应用程序,在上传脚本时出现此错误。我不明白无法读取属性错误

TypeError: Cannot read property 'from' of undefined
   at admin.firestore.collection.doc.collection.doc.get.then.queryResult 
    (/user_code/index.js:16:48)
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)

这是我的 node.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((change,context)=> {

const user_id = context.params.user_id;
const notification_id = context.params.notification_id;

console.log("User ID : " + user_id + " | Notification ID : " + notification_id);

return admin.firestore().collection("Users").doc(user_id).collection("NotificationsN").doc(notification_id).get().then(queryResult =>{

    const from_user_id = queryResult.data().from;

    const from_data = admin.firestore().collection("Users").doc(from_user_id).get();
    const to_data = admin.firestore().collection("Users").doc(user_id).get();

    return promise.all([from_data, to_data]).then(result =>{

      const from_name = result[0].data().name;
      const to_name = result[1].data().name;

      console.log("FROM : " + from_name +" TO : " + to_name)
      return null;
    }).catch(error => {
   console.error(error);
  res.error(500);
 });

  }).catch(error => {
  console.error(error);
  res.error(500);
  });
 });

标签: javascriptnode.jsfirebase

解决方案


您的代码中有一个拼写错误,试图从子集合中读取文档:

return admin.firestore().collection("Users").doc(user_id).collection("NotificationsN").doc(notification_id).get().then(queryResult =>{

注意NNotificationsN? 这在触发函数的代码中不存在:

functions.firestore.document("Users/{user_id}/Notifications/{notification_id}")

要修复错误,只需删除尾随N,留下:

return admin.firestore().collection("Users").doc(user_id).collection("Notifications").doc(notification_id).get().then(queryResult =>{

但请注意,整个操作是不必要的:您正在(重新)加载触发该功能的文档。该文档已经传递到您的函数中change.after,因此您不必重新加载它。您可以直接从那里使用它:

from_user_id = change.before.data().from;

推荐阅读