【发布时间】:2021-06-29 10:04:39
【问题描述】:
我有处理 webhook 的 firebase 函数。
此功能更新日历事件,单个事件可以同时更新。
我使用 Etag 和 If-Match 标头来防止修改丢失,如 doc 中所述。
但我仍然丢失了除最后一个之外的所有更改。
此代码对同一事件进行多次同时更新。
结果摘要中必须是“10”,但实际上是“2”。
这有什么问题?
代码
const calendarId = 'calendarid';
const scopes = [
"https://www.googleapis.com/auth/calendar",
"https://www.googleapis.com/auth/calendar.events",
];
const auth = new google.auth.GoogleAuth({ scopes });
const calendar = google.calendar({ version: "v3", auth });
...
const reproduce = async () => {
const {id: eventId} = await calendar.events.insert({
auth,
calendarId,
resource: {
summary: '1',
// some another resource data
},
});
const update = async () => {
const event = await calendar.events.get({
auth,
calendarId,
eventId,
});
console.log("***BEFORE***");
console.log("summary: " + event.summary);
console.log("etag: " + event.etag);
const previousSummary = event.summary;
const newSummary = parseInt(previousSummary) + 1;
const res = await calendar.events.patch({
auth,
calendarId,
eventId,
resource: {summary: newSummary.toString()},
}, {
headers: {
"If-Match": event.data.etag
}
});
console.log("***AFTER***");
console.log("summary: " + res.data.summary);
console.log("etag: " + res.data.etag);
}
let i = 0;
// simultaneously updates event
while (i++ < 10) {
update();
}
}
输出
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***BEFORE***
> summary: 1
> etag: "3235006977030000"
> ***AFTER***
> summary: 2
> etag: "3235006998028000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007000852000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007002822000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007003202000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007004826000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007009742000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007011058000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007014902000"
> Event updated successfully
> ***AFTER***
> summary: 2
> etag: "3235007018050000"
> Event updated successfully
【问题讨论】: