【问题标题】:Firebase error while resolving a bunch of promises: Cannot convert undefined or null to object解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象
【发布时间】:2018-06-28 11:51:03
【问题描述】:

我在运行云功能时遇到来自 firebase 的错误:

FIREBASE 警告:用户回调引发了异常。类型错误: 无法将 undefined 或 null 转换为对象

这是一个可能发生错误的sn-p:

    // const functions = require('firebase-functions');
    // const admin = require('firebase-admin');
    // const underscore = require('underscore');
    // admin.initializeApp(functions.config().firebase);
    // export updateSimilars = functions.database.ref('...').onWrite(event => {
    ...
        for (var i in callerFlattenLikesDislikes) {
            getOtherUsersPromises.push(getOtherUsersFromName(callerFlattenLikesDislikes[i], genre));
        }    
        console.log('getOtherUsersPromises length: ' + getOtherUsersPromises.length);    
        return Promise.all(getOtherUsersPromises).then(dataArr => {
                    console.log(dataArr); // will never fire
                    dataArr.forEach(data => {
                        data.forEach(user => {
                            if (otherUsers.indexOf(user) > -1 && user !== userId) {
                                otherUsers.push(user);
                            }
                        });
                    });
             ....
             ....

      function getOtherUsersFromName(name, genre) {
       console.log('fired getOtherUsersFromName: ' + name);
       return new Promise((resolve, reject) => {
        admin
            .database()
            .ref('/names/' + genre + '/' + name)
            .once('value', snapshot => {
                var dic = snapshot.val();
                var dislikingUsers = Object.keys(dic['dislikingUsers']);
                var likingUsers = Object.keys(dic['likingUsers']);
                var users = underscore.union(dislikingUsers, likingUsers);
                console.log('will resolve: ' + users);
                resolve(users);
            });
         });
       }

基本上,我有一组要异步执行的承诺(多个输入项的相同 firebase 查询)。 我想在开始处理之前收集所有结果。

但是Promise.all 之后的.then 似乎永远不会被解雇,而且我有以下firebase 日志:

有人帮我吗?

谢谢!

【问题讨论】:

    标签: javascript node.js firebase promise google-cloud-functions


    【解决方案1】:

    我认为您需要检查路径 '/names/' + genre + '/' + name 中是否存在名称。此路径为空时会报错。

    function getOtherUsersFromName(name, genre) {
           console.log('fired getOtherUsersFromName: ' + name);
           return new Promise((resolve, reject) => {
            admin
                .database()
                .ref('/names/' + genre + '/' + name)
                .once('value', snapshot => {
                   if (snapshot.exists()){
                    var dic = snapshot.val();
                    var dislikingUsers = Object.keys(dic['dislikingUsers']);
                    var likingUsers = Object.keys(dic['likingUsers']);
                    var users = underscore.union(dislikingUsers, likingUsers);
                    console.log('will resolve: ' + users);
                    resolve(users); 
                   } else {
                      // Do something as the path is empty
                   }
                });
             });
           }
    

    【讨论】:

    • 感谢 HakanC!该名称通常应该存在,因为它来自这条路径......但我会检查这个......
    • 我认为问题出在 `var dislikingUsers = Object.keys(dic['dislikingUsers']);` 并且 dislikingUsers 没有定义。或者我找不到它。下一行也一样。我的意思是错误说cannot convert empty or null
    • dic['dislikingUsers']dic.dislikingUsers 相同,应该这样写。 dic['likingUsers'] 也一样
    • 顺便说一句,从 Promise 构造函数抛出的错误将拒绝 Promise,因此如果各个 Promise 上有 .catch(console.log),那么您应该会在日志中看到错误。
    • 比较省钱的可以写var dislikingUsers = Object.keys(dic.dislikingUsers || {});
    猜你喜欢
    • 2023-02-21
    • 2021-12-17
    • 2021-12-12
    • 2022-12-17
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2020-08-15
    • 2022-10-18
    相关资源
    最近更新 更多