因此,我正在创建一个社交媒体应用程序,用户将不得不设置他们的唯一用户名。
技术栈
技术栈是Nextjs、Prisma和MySQL (由Planetscale托管)。对于表格,我使用Formik和Yup。
可能的解决方案
我现在想到的是,我将在NextJS中设置一个API,并公开所有的用户名,这样Yup就可以通过这个API路由(localhost:3000/api/allusername)测试唯一性。
或者,我希望使用Prisma、findUnique或finduniqueorthrow来进行检查,但我不太清楚如何在Formik/Yup中实现它。
注释
本能告诉我,在API中公开所有用户是个坏主意。同时,由于它是一款社交媒体应用,所以它本身就会暴露用户。(这并不是说,Planetscale将收取每行读取的费用,而且如果每次有人设置用户名,而我不得不让他们读取所有行(例如10k用户),那将是一个巨大的负担)。
有人对如何测试唯一性的最佳实践有什么想法吗?
发布于 2022-07-06 04:05:09
你问题的许多部分都需要大量的代码--我将概述这个过程。
对于实时客户端验证,您需要按照您所描述的那样做,并设置一个要检查的API路由。
这是可选的,因为在创建用户时,您只能选择检查服务器端;但是,用户体验不会像在客户端和服务器上检查一样好。
对于服务器端验证,必须在数据库上设置唯一约束,以确保唯一性.为了安全起见,最好的做法是验证所有数据服务器端。
在Prisma中,您使用@@唯一装潢师,并通过检查PrismaClientKnownRequestError和Prisma错误码来捕获API中唯一的约束验证错误。
然后,将错误消息传递给客户端,以便向用户提供反馈。下面是一个关于如何在与Yup的反应中实现这一点的随机示例。
行星比例尺不充电直至你点击1B行读取。我现在不担心成本问题,而是选择客户端验证,因为这是针对注册页面的;用户体验和减少摩擦在这里非常重要。
发布于 2022-07-06 03:05:48
在数据库中,在您想要唯一的字段周围创建一个唯一的或主键。当您尝试插入一个副本时,您将得到一个重复的键错误。在您的应用程序中捕获它并进行适当的处理。
因此,千万不要预先检查,因为这取决于种族状况。
发布于 2022-07-06 04:30:57
只有一种安全可靠的重复检测方法--在SQL服务器端执行此检测。
必须通过存储值所在的SQL server表结构中的列或表达式创建唯一索引,并将该表达式中包含的所有列定义为非空。或者,您可以通过这个列/expression创建主键,创建唯一索引,并自动将所有提到的列定义为非空列。现在您可以简单地插入--如果要插入的数据已经存在,那么SQL服务器将不会插入数据,并将生成唯一的违反约束的错误,应用程序应该会检测到该错误。
您可能的解决方案尝试在客户端执行唯一性检查--只有在检查和释放此锁之前(当然,如果唯一性检查成功的话),只有在检查和释放此锁之前将表单独锁定为读和写表时,才能保证并发环境中的唯一性(当然,如果唯一性检查成功),但此锁可能会大大降低性能。
https://stackoverflow.com/questions/72877268
复制相似问题