解决一堆承诺时出现 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 响应时出现未捕获(承诺)错误