热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在云函数的循环内设置等待表达式?

这是我的Firebase云功能的简化代码:constadminrequire("..utilitiesfirebase_admin_init

这是我的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包装器中,而您使用的是节点版本


推荐阅读
author-avatar
卡哇伊--欣欣_749
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有