如何处理将数据持久化到数据库中的表单提交中断?

How to handle an interruption in a form submit that's persisting data into the database?

我正在使用两个端点处理用户注册,一个创建 user,另一个创建 user_fileuser_file table 持有对 user table 的引用。处理正在提交的表单的函数如下所示:

  const onSubmit = async () => {
    // 1. create a user
    let response = await axios.post('/users', userData);

    // the id of the newly created user (we need it for the next steps)
    let userId = response.data.id;

    // 2. create a user file for the newly created user, type profile image
    await axios.post(`/userfile?type=avatar&userId=${userId}`, profileImageFile);

    // 3. create a file for the newly created user, type cv
    await axios.post(`/userfile?type=cv&userId=${userId}`, cvFile);
  }

如果在步骤之间发生某些事情,我将得到不完整的数据,例如:用户点击“提交”但他在后端上传他的个人资料图片时提前离开了页面,这意味着 user 注册已创建,但 none 个文件已创建,使数据库留下“不完整”的用户。

我可以做些什么来确保创建所有记录吗?因为我需要用户的 ID 来上传文件,所以我知道这将是一个棘手的问题,因为它需要撤消数据库中所做的某些事情,但我很好奇你们是否遇到过这个问题以及你们会如何继续解决。

注意:我目前在需要您在注册时上传多个文件的应用程序中遇到这个问题,因此获取不完整数据的风险更大,我遇到过几个连接不良且创建时没有某些文件的用户实例。我正在为数据库使用 MySQL

  1. 我会将这 3 个请求合并为 1 个。这样就没有什么是不完整的了。

  2. 另一种解决方案是使用布尔值指示用户“已满”,并且仅在完成所有 3 个操作后才设置此布尔值。这样你就可以使用 cron 来删除不完整的用户或使用任何其他处理方式。

ps:不完整用户的真正问题是什么?只需让他们在需要时重试即可。您甚至可以通过电子邮件提醒他们这样做。