5 分钟无更新后覆盖 firestore 字段
Overwrite firestore field after 5 minutes of no update
我正在显示保存来自 Google firestore 数据的卡片。其中一个字段是 "Status"。可以从应用程序外部远程打开和关闭状态。我希望状态在 5 分钟后或文档没有更新 5 分钟后自动变为“关闭”。
我想在用户失去连接并且无法再发送 "Status": "Off" 消息的情况下执行此操作。我不希望卡片永远只说 "On"。
我正在使用 Vue.js 并尝试了一些不同的方法,但我不太确定如何完成此操作。如果这个问题更适合不同的网站,我深表歉意。我已经查找过类似的问题,但找不到任何内容。
这是一个屏幕截图,可以直观地显示我要问的内容。如果 5 分钟内未更新,我希望状态变为 "Off"。或者任何时间。
<div >
<div class="ma-4">
<div centered class="text-lg-center headline">
Live Middleware Status
<p v-bind="allig">{{ seconds }}</p>
</div>
</div>
<v-card slow v-bind="allig" :class="`mx-4 my-4 ${user.Status}`" v-for="user in users" :key="user.id">
<v-card-title flat class="pa-n3">
<v-flex class="mx-auto" xs6 sm4 md2 lg2>
<div class="caption grey--text">Location Site ID</div>
<div class="title">{{user.id}}</div>
</v-flex>
<v-flex class="mr-auto " xs6 sm4 md2 lg2>
<div class="caption grey--text">ID</div>
<div class=" ml-n12 title">{{user.CustomerID}}</div>
</v-flex>
<v-flex style :class="`mx-auto ${user.Status}`" xs6 sm4 md2 lg2>
<div class="caption grey--text">Current Status</div>
<div class="status title mx-2">{{user.Status}}</div>
</v-flex>
<v-flex style class="mx-auto caption green--text" xs6 sm4 md2 lg2>
<div class="caption grey--text">Last Message</div>
<div class="Green my-2 title">{{user.TimeStamp}}</div>
</v-flex>
</v-card-title>
</v-card>
</div>
</template>
<script>
// eslint-disable-next-line
import firestore from "firestore";
// eslint-disable-next-line
import db from "@/components/fbInit";
import firebase from "firebase";
export default {
// eslint-disable-next-line
components: { },
data() {
return {
wide: false,
ToggleDelete: false,
card: true,
light: true,
seconds: "",
users: [],
links: [{ route: "/logs" }]
};
},
created() {
var user = firebase.auth().currentUser;
var employeeRef = db
.collection("userProfiles")
.doc(user.uid)
.collection("MX")
.orderBy("TimeStamp", "desc")
employeeRef.onSnapshot(snap => {
// eslint-disable-next-line
console.log(snap.size);
this.users = [];
snap.forEach(doc => {
const data =
{
id: doc.id,
Name: doc.data().Name,
GroupHex: doc.data().GroupHex,
DeviceType: doc.data().DeviceType,
UserIDInt: doc.data().UserIDInt,
CustomerID: doc.data().CustomerID,
SiteID: doc.data().SiteID,
SuperID: doc.data().SuperID,
Status: doc.data().Status,
TimeStamp: doc.data().TimeStamp,
Original: doc.data().Original
};
this.users.push(data);
});
});
},
methods: { }
};
</script>
要可靠地执行此操作,您需要让服务器端进程定期检查和更新文档。一种直接的方法是使用 scheduled Cloud Function。它看起来像这样:
// functions/index.js
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
exports.updateIdle = functions.pubsub.schedule('* * * * *').onRun(async () => {
const snap = await db.collection("MX")
.where("Status", "=", "On")
.where("Timestamp", "<", admin.firestore.Timestamp.fromMillis(Date.now() - 5 * 60000))
.get();
await Promise.all(snap.docs.map(doc => doc.ref.update({Status: 'Off'})));
});
上述函数将每分钟 运行 查找时间戳超过五分钟前的任何文档,并更新每个文档以具有 "Off"
状态。
这只是一个示例,您可能需要根据自己的具体需要进行一些不同的操作。
我正在显示保存来自 Google firestore 数据的卡片。其中一个字段是 "Status"。可以从应用程序外部远程打开和关闭状态。我希望状态在 5 分钟后或文档没有更新 5 分钟后自动变为“关闭”。
我想在用户失去连接并且无法再发送 "Status": "Off" 消息的情况下执行此操作。我不希望卡片永远只说 "On"。
我正在使用 Vue.js 并尝试了一些不同的方法,但我不太确定如何完成此操作。如果这个问题更适合不同的网站,我深表歉意。我已经查找过类似的问题,但找不到任何内容。
这是一个屏幕截图,可以直观地显示我要问的内容。如果 5 分钟内未更新,我希望状态变为 "Off"。或者任何时间。
<div >
<div class="ma-4">
<div centered class="text-lg-center headline">
Live Middleware Status
<p v-bind="allig">{{ seconds }}</p>
</div>
</div>
<v-card slow v-bind="allig" :class="`mx-4 my-4 ${user.Status}`" v-for="user in users" :key="user.id">
<v-card-title flat class="pa-n3">
<v-flex class="mx-auto" xs6 sm4 md2 lg2>
<div class="caption grey--text">Location Site ID</div>
<div class="title">{{user.id}}</div>
</v-flex>
<v-flex class="mr-auto " xs6 sm4 md2 lg2>
<div class="caption grey--text">ID</div>
<div class=" ml-n12 title">{{user.CustomerID}}</div>
</v-flex>
<v-flex style :class="`mx-auto ${user.Status}`" xs6 sm4 md2 lg2>
<div class="caption grey--text">Current Status</div>
<div class="status title mx-2">{{user.Status}}</div>
</v-flex>
<v-flex style class="mx-auto caption green--text" xs6 sm4 md2 lg2>
<div class="caption grey--text">Last Message</div>
<div class="Green my-2 title">{{user.TimeStamp}}</div>
</v-flex>
</v-card-title>
</v-card>
</div>
</template>
<script>
// eslint-disable-next-line
import firestore from "firestore";
// eslint-disable-next-line
import db from "@/components/fbInit";
import firebase from "firebase";
export default {
// eslint-disable-next-line
components: { },
data() {
return {
wide: false,
ToggleDelete: false,
card: true,
light: true,
seconds: "",
users: [],
links: [{ route: "/logs" }]
};
},
created() {
var user = firebase.auth().currentUser;
var employeeRef = db
.collection("userProfiles")
.doc(user.uid)
.collection("MX")
.orderBy("TimeStamp", "desc")
employeeRef.onSnapshot(snap => {
// eslint-disable-next-line
console.log(snap.size);
this.users = [];
snap.forEach(doc => {
const data =
{
id: doc.id,
Name: doc.data().Name,
GroupHex: doc.data().GroupHex,
DeviceType: doc.data().DeviceType,
UserIDInt: doc.data().UserIDInt,
CustomerID: doc.data().CustomerID,
SiteID: doc.data().SiteID,
SuperID: doc.data().SuperID,
Status: doc.data().Status,
TimeStamp: doc.data().TimeStamp,
Original: doc.data().Original
};
this.users.push(data);
});
});
},
methods: { }
};
</script>
要可靠地执行此操作,您需要让服务器端进程定期检查和更新文档。一种直接的方法是使用 scheduled Cloud Function。它看起来像这样:
// functions/index.js
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
exports.updateIdle = functions.pubsub.schedule('* * * * *').onRun(async () => {
const snap = await db.collection("MX")
.where("Status", "=", "On")
.where("Timestamp", "<", admin.firestore.Timestamp.fromMillis(Date.now() - 5 * 60000))
.get();
await Promise.all(snap.docs.map(doc => doc.ref.update({Status: 'Off'})));
});
上述函数将每分钟 运行 查找时间戳超过五分钟前的任何文档,并更新每个文档以具有 "Off"
状态。
这只是一个示例,您可能需要根据自己的具体需要进行一些不同的操作。