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

云函数使用array-contains-any查询报错:需传入数组类型参数

问题解决思路

核心错误原因

报错'ARRAY_CONTAINS_ANY' requires an ArrayValue的直接原因是:你传给array-contains-any的第三个参数是单个字符串jobType,但Firestore要求这个参数必须是数组类型,哪怕只需要匹配一个值。

修复方式

因为你只需要匹配单个工作类型,推荐用array-contains(专门用于匹配数组中包含某个单个值的场景,比array-contains-any更高效),或者保持array-contains-any但传数组参数:

// 方式一:用array-contains匹配单个值(推荐)
const usersWithJobTypePreferenceList = await admin.firestore()
  .collection("user")
  .where("User job notifications preferences", "array-contains", jobType)
  .get();

// 方式二:保持array-contains-any,传入数组参数
const usersWithJobTypePreferenceList = await admin.firestore()
  .collection("user")
  .where("User job notifications preferences", "array-contains-any", [jobType])
  .get();

其他潜在问题修复

你的代码还有几个逻辑问题需要修正,避免后续出现异常:

1. 发送通知时只会给第一个用户发消息

循环发送通知的代码里,return await admin.messaging().sendToDevice(...)会导致循环执行第一次就直接返回云函数,后续用户都收不到通知。建议用Promise.all批量发送提升效率:

const messageTitle = "new " + jobType + " has been created";
const sendPromises = userTokenList.map(token => {
  const payload = {
    notification: {
      title: messageTitle,
      body: messageTitle,
      sound: "default",
    },
    data: {
      click_action: "FLUTTER_NOTIFICATION_CLICK",
      message: "Sample Push Message",
    },
  };
  return admin.messaging().sendToDevice(token, payload);
});
await Promise.all(sendPromises);

2. 遍历用户ID数组用错循环方式

for (var user in userIdsList)是遍历对象键名的方式,用于数组会拿到索引而非实际用户ID,应换成for...of:

const userTokenList = [];
for (const userId of userIdsList) {
  const tokenDoc = await admin.firestore().collection("user token").doc(userId).get();
  // 增加文档存在判断,避免无token时报错
  if (tokenDoc.exists) {
    const userToken = tokenDoc.data()["token"];
    userTokenList.push(userToken);
  }
}

3. 未处理Token文档不存在的情况

如果某个用户没有对应的Token文档,直接访问tokenDoc.data()["token"]会抛出错误,必须先判断文档是否存在,如上代码所示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:15:35