You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中将Firestore的preferences集合转为指定数组的问题求助

解决Firestore数据转目标数组的问题

嘿,别着急,咱们一步步来修复你的代码,把Firestore里的preferences集合数据转成你想要的数组结构~

你的代码里的核心问题

  1. 对collection.get()返回值的误解:当调用db.collection('/preferences').get()时,返回的是QuerySnapshot(集合的查询快照),不是单个文档的DocumentSnapshot。所以你用doc.exists和doc.data()是错误的——QuerySnapshot没有这两个属性,你需要遍历它包含的所有文档。
  2. 初始值类型错误:你把engineers初始化为对象{},但目标是数组[],类型不匹配。
  3. 异步逻辑问题: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' });
  }
};

额外说明

  • 确保你的Firestorepreferences集合里的每个文档,结构正好是你目标数组里的单个对象(比如一个文档存{ html: 5, angular: 5, react: 3, css: 3 }这样的数据),这样doc.data()就能直接拿到对应项。
  • 修正了函数名里的拼写错误(getPreferancesArray → getPreferencesArray),你需要同步修改index.js里的引入:
// index.js 里的引入部分
const { getPreferencesArray } = require('./enginer'); 

这样调整后,你的/kmeansArray接口就能返回你想要的数组结构啦~

内容的提问来源于stack exchange,提问作者user13608061

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:57:05