JavaScript中如何将变量k写入Firebase数据库的多个路径?
问题解决:ReferenceError: k is not defined 报错修复
错误原因
你在keyArray.map()的箭头函数里误用了逗号运算符,把两个set操作分开写:
k => (db.ref(...).set(...), db.ref(...).set(...))
这种写法下,逗号运算符会先执行第一个set,然后只返回第二个set的Promise,同时存在两个关键问题:
- 第一个
set的Promise被直接丢弃,无法追踪它的执行状态 - 这种写法没有将两个异步操作合并为一个可等待的Promise,导致外层
Promise.all无法正确处理,进而触发作用域解析异常,出现k is not defined报错
修复方案
每个k对应的两个set操作需要用Promise.all包裹,确保两个异步操作都完成后再返回给外层的Promise.all。修改后的代码如下:
function checkpath() { var db = admin.database(); var ref = db.ref('placeID/here:pds:place:276u0wuu-237aa2a/' + messageID + '/notification'); ref.get() .then((snapshot) => { if (snapshot.exists()) { const keyArray = Object.keys(snapshot.val()); return Promise.all(keyArray.map(k => // 用Promise.all包裹当前k对应的两个异步写入操作 Promise.all([ db.ref('/user/' + k + '/notification/' + subMessageID + '/subMessageID/').set(subMessageID), db.ref('/user/' + k + '/notification/' + subMessageID + '/userTime/').set(userTime) ]) )); } else { console.log('No data available'); return null; } }) }
补充说明
- 内层
Promise.all([...])负责等待当前k对应的两个写入操作全部完成 - 外层
Promise.all(keyArray.map(...))负责等待所有k的写入操作全部完成 - 这种写法既保证了所有异步操作的执行状态都被追踪,也避免了作用域相关的错误
内容的提问来源于stack exchange,提问作者submariner
相关产品推荐
相关产品推荐

