批量注册用户 - Parse Platform

问题描述 投票:0回答:1

我正在使用 Parse 在 iOS 中创建一个应用程序,学区管理员将使用其学生信息系统数据为该学区的所有学生批量创建帐户。

我想知道是否存在可以创建大量帐户的方法?我知道我可以设置一个 for-in 语句,使用

signUpInBackground()
使它们一一对应,但是这种方法会导致当前用户注销,而新创建的用户登录......从而失去了地区管理员会议。

parse-platform
1个回答
0
投票

正如您所说,

signUpInBackground()
确实更改了应用程序的当前用户,这对于docs中所述的所有注册和登录方法都是如此:

每当您使用任何注册或登录方法时,用户都会缓存在磁盘上。

因此从客户端解决这个问题可能不是正确的方法。

正确的解决方案是使用云代码。我们可以从创建一个云函数开始,该函数将获取用户列表并为该列表中的每条记录生成

Parse.User
。但是,当有足够的大数据输入时,我们可能会开始遇到超时问题,因为保存所有记录所需的时间将比云代码函数执行的最大保留时间长。这显然取决于服务器的配置和可用资源,但一般来说,建议保持云函数相当短且高效,以确保良好的性能。

考虑到这将是批量创建记录,我们需要支持长时间运行的任务

有时您想要执行长时间运行的函数,并且不想等待响应。云作业就是为了这个目的。

因此批量注册用户的正确选择是云作业。实现目标的步骤可能是:

  1. 定义获取用户输入数组的云函数。该函数将调用云作业并将用户数组转发给它。
Parse.Cloud.define('invokeCreateUsersJob', (req) => {
  const users = req.params.users
  const isArray = Array.isArray(users)

  // Return error in case users parameter is not an array
  if (!isArray) {
    return new Error('users paramater must be an array type')
  }

  // Invoke cloud job with users array
  return Parse.Cloud.startJob('createUsersJob', { users })
})

如果一切按计划进行,

invokeCreateUsersJob
函数将返回作业状态 ID,稍后可通过调用
Parse.Cloud.getJobStatus(jobStatusId)
来检查作业状态。

  1. 定义云作业,将用户数组映射到
    Parse.User
    对象。创建的用户可以批量注册。有一篇很棒的 post 关于在 parse 中批量插入 以及为什么
    Parse.Object.saveAll()
    可能不是正确的选择。这是我的解决方案,源自前面提到的帖子,但针对注册用户进行了重新设计。
Parse.Cloud.job('createUsersJob', async (req) => {
  
  const users = req.params.users

  let parseUsers = users.map((user) => {
    // Map user fields to Parse.User object
    const parseUser = new Parse.User()
    parseUser.set('username', user.username)
    parseUser.set('password', user.password)
    parseUser.set('email', user.email)
    return parseUser
  })

  // Decide what number of users you want to save at a time
  const batchSize = 100
  let batches = []

  // Loop through the parse users
  // adding batch size to index
  // on every repetition
  for (let i = 0; i < parseUsers.length; i += batchSize) {
    // Take a slice of array as a batch
    const batch = parseUsers.slice(i, i + batchSize)
    // and map items of batch to promises
    const promises = batch.map( (pu) => pu.signUp(null, { useMasterKey: true }) )
    batches.push(promises)
  }

  // Now await every batch
  // before proceeding to next one
  for (const batch of batches) {
    await Promise.all(batch)
  }

  return "Number of users successfully saved: " + parseUsers.length
})

现在您已经有了在解析服务器上批量注册用户的解决方案,现在可以从任何能够与解析通信的客户端使用该解决方案。

可以通过Parse SDK内置方法或通过http请求来调用云函数。关于如何在 iOS 上实现这一点,请阅读 Parse SDK guide

© www.soinside.com 2019 - 2024. All rights reserved.