首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查唯一价值的正常做法是什么?

检查唯一价值的正常做法是什么?
EN

Stack Overflow用户
提问于 2022-07-06 02:17:35
回答 3查看 190关注 0票数 0

因此,我正在创建一个社交媒体应用程序,用户将不得不设置他们的唯一用户名。

技术栈

技术栈是Nextjs、Prisma和MySQL (由Planetscale托管)。对于表格,我使用Formik和Yup。

可能的解决方案

我现在想到的是,我将在NextJS中设置一个API,并公开所有的用户名,这样Yup就可以通过这个API路由(localhost:3000/api/allusername)测试唯一性。

或者,我希望使用Prisma、findUniquefinduniqueorthrow来进行检查,但我不太清楚如何在Formik/Yup中实现它。

注释

本能告诉我,在API中公开所有用户是个坏主意。同时,由于它是一款社交媒体应用,所以它本身就会暴露用户。(这并不是说,Planetscale将收取每行读取的费用,而且如果每次有人设置用户名,而我不得不让他们读取所有行(例如10k用户),那将是一个巨大的负担)。

有人对如何测试唯一性的最佳实践有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-06 04:05:09

你问题的许多部分都需要大量的代码--我将概述这个过程。

对于实时客户端验证,您需要按照您所描述的那样做,并设置一个要检查的API路由。

这是可选的,因为在创建用户时,您只能选择检查服务器端;但是,用户体验不会像在客户端和服务器上检查一样好。

对于服务器端验证,必须在数据库上设置唯一约束,以确保唯一性.为了安全起见,最好的做法是验证所有数据服务器端。

在Prisma中,您使用@@唯一装潢师,并通过检查PrismaClientKnownRequestErrorPrisma错误码来捕获API中唯一的约束验证错误。

然后,将错误消息传递给客户端,以便向用户提供反馈。下面是一个关于如何在与Yup的反应中实现这一点的随机示例

行星比例尺不充电直至你点击1B行读取。我现在不担心成本问题,而是选择客户端验证,因为这是针对注册页面的;用户体验和减少摩擦在这里非常重要。

票数 1
EN

Stack Overflow用户

发布于 2022-07-06 03:05:48

在数据库中,在您想要唯一的字段周围创建一个唯一的或主键。当您尝试插入一个副本时,您将得到一个重复的键错误。在您的应用程序中捕获它并进行适当的处理。

因此,千万不要预先检查,因为这取决于种族状况。

票数 0
EN

Stack Overflow用户

发布于 2022-07-06 04:30:57

只有一种安全可靠的重复检测方法--在SQL服务器端执行此检测。

必须通过存储值所在的SQL server表结构中的列或表达式创建唯一索引,并将该表达式中包含的所有列定义为非空。或者,您可以通过这个列/expression创建主键,创建唯一索引,并自动将所有提到的列定义为非空列。现在您可以简单地插入--如果要插入的数据已经存在,那么SQL服务器将不会插入数据,并将生成唯一的违反约束的错误,应用程序应该会检测到该错误。

您可能的解决方案尝试在客户端执行唯一性检查--只有在检查和释放此锁之前(当然,如果唯一性检查成功的话),只有在检查和释放此锁之前将表单独锁定为读和写表时,才能保证并发环境中的唯一性(当然,如果唯一性检查成功),但此锁可能会大大降低性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72877268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档