解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象

Posted

技术标签:

【中文标题】解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象【英文标题】:Firebase error while resolving a bunch of promises: Cannot convert undefined or null to object 【发布时间】: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 日志:

有人帮我吗?

谢谢!

【问题讨论】:

【参考方案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 || );

以上是关于解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

测试时出现“mpromise(猫鼬的默认承诺库)已弃用”错误[重复]

在云功能上使用 Firestore SDK 时出现错误:无法编码类型

未捕获(承诺)类型错误:尝试打开窗口时出现问题

尝试在 if 语句中检查 json 响应时出现未捕获(承诺)错误

将 Firebase 与 RecyclearView 一起使用时出现错误

为啥在尝试将firebase添加到flutter时出现此错误“已弃用的API”