如何编写 Firestore 安全规则以允许单个字段中出现空值和未定义值?

Agu*_*ana 4 firebase firebase-security google-cloud-firestore

我的 Firestore 文档中有一个字段,lastApproval如果它有值,则该字段应该是时间戳。

这是我的简化规则

match /users/{userID} {

  allow create: if isValidUserStructure(incomingData())
  allow update: if isValidUserStructure(incomingData())

}

function incomingData() {
  return request.resource.data;
}


function isValidUserStructure(user) {
    return  user.email is string
         && user.fullname is string
         && user.lastApproval is timestamp  // error in here

}
Run Code Online (Sandbox Code Playgroud)

如您所见,isValidUserStructure函数将用于在创建和更新用户文档时进行检查。

创建用户文档时,该lastApproval字段将为空,如下所示

const data = {
  fullname: 'John Doe',
  email: 'my@email.com',
  lastApproval: null
};

await db.collection('users').doc('userIDHere').set(data);
Run Code Online (Sandbox Code Playgroud)

但在更新文档时,我只想要时间戳。

const data = {
  lastApproval: new Date()
};

await db.collection('users').doc('userIDHere').update(data);
Run Code Online (Sandbox Code Playgroud)

而且,如果不可用,我想传递安全规则lastApproval,例如,如果用户只想像这样更新全名

const data = {
  fullname: "My New Name"
};

await db.collection('users').doc('userIDHere').update(data);
Run Code Online (Sandbox Code Playgroud)

所以我希望我的安全规则接受lastApproval字段的时间戳、空值和未定义值

我已经尝试过但错误

在此输入图像描述

请帮忙 :)

Dha*_*raj 5

null据我所知没有任何类型。您可以在文档中找到所有可用的类型。

如果您想检查该值是否为空,请尝试user.lastApproval == null改为。要检查该lastApproval 属性是否首先存在,请尝试以下操作:

match /collection/{doc} {
  allow write: if 'lastApproval' in request.resource.data && (..otherLogic)
}
Run Code Online (Sandbox Code Playgroud)

所以你可以将你的函数写为:

function isValidUserStructure(user) {
    return  user.email is string
         && user.fullname is string
         && (('lastApproval' in user && user.lastApproval is timestamp) || !('lastApproval' in user)) 
}

Run Code Online (Sandbox Code Playgroud)