Node.js中将Firestore的preferences集合转为指定数组的问题求助
解决Firestore数据转目标数组的问题
嘿,别着急,咱们一步步来修复你的代码,把Firestore里的preferences集合数据转成你想要的数组结构~
你的代码里的核心问题
- 对
collection.get()返回值的误解:当调用db.collection('/preferences').get()时,返回的是QuerySnapshot(集合的查询快照),不是单个文档的DocumentSnapshot。所以你用doc.exists和doc.data()是错误的——QuerySnapshot没有这两个属性,你需要遍历它包含的所有文档。 - 初始值类型错误:你把
engineers初始化为对象{},但目标是数组[],类型不匹配。 - 异步逻辑问题:
res.json(engineers)写在了then块外面,会在数据库请求还没完成就执行,导致返回空的对象/数组。
修正后的代码(两种写法)
写法1:用Promise的then/catch(保持你原来的风格)
// enginer.js 文件(注意:建议把Preferances改成Preferences拼写更规范) const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); exports.getPreferencesArray = (req,res) => { // 初始化为空数组,而不是对象 let engineers = []; db.collection(`/preferences`).get() .then((querySnapshot) => { // 遍历集合里的每一个文档 querySnapshot.forEach((doc) => { // 把每个文档的数据push到数组里 engineers.push(doc.data()); }); // 遍历完成后再返回结果 res.json(engineers); }) .catch((error) => { // 处理可能的数据库请求错误 console.error('获取数据失败:', error); res.status(500).json({ error: 'Failed to fetch preferences' }); }); };
写法2:用async/await(更易读,适合新手理解异步逻辑)
// enginer.js 文件 const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); // 把函数改成async函数 exports.getPreferencesArray = async (req,res) => { try { let engineers = []; const querySnapshot = await db.collection(`/preferences`).get(); querySnapshot.forEach((doc) => { engineers.push(doc.data()); }); res.json(engineers); } catch (error) { console.error('获取数据失败:', error); res.status(500).json({ error: 'Failed to fetch preferences' }); } };
额外说明
- 确保你的Firestore
preferences集合里的每个文档,结构正好是你目标数组里的单个对象(比如一个文档存{ html: 5, angular: 5, react: 3, css: 3 }这样的数据),这样doc.data()就能直接拿到对应项。 - 修正了函数名里的拼写错误(
getPreferancesArray→getPreferencesArray),你需要同步修改index.js里的引入:
// index.js 里的引入部分 const { getPreferencesArray } = require('./enginer');
这样调整后,你的/kmeansArray接口就能返回你想要的数组结构啦~
内容的提问来源于stack exchange,提问作者user13608061
相关产品推荐
相关产品推荐

