作者:卡哇伊--欣欣_749 | 来源:互联网 | 2023-09-18 11:49
这是我的Firebase云功能的简化代码:
const admin = require("../utilities/firebase_admin_init")
const db = admin.firestore()
exports.crOnDeactivatingExpiredEvents= functions.https.onRequest(async (request,response) => {
const now = new Date()
const OneMonthAgo= moment().subtract(1,"month").toDate()
try {
const expiredEventssnapshot = await eventRef
.where("isactive","==",true)
.where("hasBeenApproved",true)
.where("dateTimeStart",">",oneMonthAgo)
.where("dateTimeStart","<",now)
.get()
const expiredEventIDs = [] // list of IDs here ....
// prepare promises to delete event data in user 'attendedEvents' subcollection.
const deleteAttendedEventsDataPromises = []
for (const eventID of expiredEventIDs) {
const eventAttendeesnapshot = await db.collection("events").doc(eventID).collection("Attendee").get()
const attendeeDocuments = eventAttendeesnapshot.docs
// getting all attendeeIDs.
const attendeeIDs = []
attendeeDocuments.forEach( attendeesnapshot => {
const attendee = attendeesnapshot.data()
attendeeIDs.push(attendee.uid)
})
attendeeIDs.forEach( attendeeID => {
const p = db.collection("users").doc(attendeeID).collection("attendedEvents").doc(eventID).delete()
deleteAttendedEventsDataPromises.push(p)
})
}
// delete event data in user 'attendedEvents' subcollection
await Promise.all(deleteAttendedEventsDataPromises)
console.log(`successfully delete all events data in all attendee user subcollection`)
response.status(200).send(`sucess`)
} catch (error) {
response.status(500).send(error)
}
})
如您在上面看到的那样,循环内有一个await表达式,但是我有一个错误标记,如下图所示,所以我无法部署该函数:
运行firebase deploy
后出现错误
/Users/muchammadagunglaksana/Documents/kumpul_muslim/cloud_functions_serverless_backend/functions/service/cron_operations.js
140:43错误await
在循环内没有预料不到的循环
170:41错误“ await
”在循环内没有等待循环
✖2个问题(2个错误,0个警告)
npm错误!代码ELIFECYCLE npm ERR! errno 1 npm错误!功能@棉绒:
eslint .
npm错误!退出状态1 npm ERR! npm ERR!失败于
functions @ lint脚本。 npm ERR!这可能不是问题
npm。上面可能还有其他日志记录输出。
npm错误!有关此运行的完整日志,请参见:npm ERR!
/Users/muchammadagunglaksana/.npm/_logs/2019-12-14T10_47_36_788Z-debug.log
错误:函数预部署错误:命令以非零终止
退出代码1
我尝试从此处Using async/await with a forEach loop阅读一些解决方案。像这样使用for await
确实会消失红色错误标记,但是我仍然无法部署该功能。这是我运行firebase deploy
后的错误
functions [cronDeactivatingExpiredEvents(us-central1)]:部署
错误。加载用户代码时功能失败。错误消息:输入代码
无法加载文件index.js。您的代码中是否存在语法错误?
详细的堆栈跟踪:/srv/service/cron_operations.js:138
for await(algoliaObjectIDs的const eventID){// algoliaObjectIDs与过期的EventID相同
^^^^^
SyntaxError:意外的保留字
在createScript(vm.js:80:10)
在Object.runInThisContext(vm.js:139:10)
在Module._compile(module.js:617:28)
在Object.Module._extensions..js(module.js:664:10)
在Module.load(module.js:566:32)
在tryModuleLoad(module.js:506:12)
在Function.Module._load(module.js:498:3)
在Module.require(module.js:597:17)
在要求时(internal / module.js:11:18)
在对象。 (/srv/index.js:2:24)
在我使用的.eslintrec.json中:
"parserOptions": {
// Required for certain syntax usages
"ecmaVersion": 2018
},
我是云功能以及后端开发的新手。很抱歉,我的问题太基本了。
我该怎么办?
第一个错误是关于eslint
的规则no-await-in-loop
,因为操作是串行的,所以不允许循环进行循环,基本上不是并行的,以减少资源和时间的浪费。
您所能做的就是像推销承诺然后Promise.all
那样使用它,也可以仅禁用该部分的规则。
/* eslint-disable no-await-in-loop */
for (const eventID of expiredEventIDs) {
const eventAttendeeSnapshot = await db.collection("events").doc(eventID).collection("Attendee").get()
const attendeeDocuments = eventAttendeeSnapshot.docs
....
....
}
/* eslint-enable no-await-in-loop */
第二个错误意味着您忘记将for-await-of
包装在async function
包装器中或,而您使用的是节点版本