【问题标题】:FeathersJS way of preventing duplicates in a serviceFeathersJS 防止服务重复的方法
【发布时间】:2018-09-14 07:18:05
【问题描述】:

我正在使用 FeathersJS 和 MongoDB 开发一个应用程序。我想防止某些服务创建某些值(或值对)的重复项。

例如,使用 feathers-cli 工具创建的 FeathersJS“身份验证”服务不会阻止应用使用相同的电子邮件创建 2 个或更多用户(至少使用 MongoDB)。另一个例子是为每个用户创建一些“类别”的服务。我希望后端阻止用户创建 2 个或多个具有相同名称的类别,但我需要允许 2 个不同的用户创建自己的类别,尽管他们的名称相同(但不是用户)。

我知道我可以通过在 MongoDB 集合中使用索引来做到这一点,但这会使应用程序依赖于 MongoDB。

有没有人知道是否有任何类型的钩子或任何推荐的方式来做这些事情“FeathersJS 方式”?

谢谢!

【问题讨论】:

    标签: hook feathersjs


    【解决方案1】:

    在大多数情况下,唯一性可以而且应该在数据库或 ORM/ODM 级别得到保证,因为它会为您提供最佳性能(在大多数情况下不值得为可移植性而牺牲)。

    Feathers hooks 是一种更符合 Feathers 的方式并完成更复杂的限制,这是 Feathers 的重要组成部分,并详细解释了in the basics guide

    在这种情况下,before 钩子可以查询total of items 并抛出error(如果有):

    const { Conflict } = require('@feathersjs/errors');
    
    app.service('myservice').hooks({
      before: {
        create: [async context => {
          const { fieldA, fieldB } = context.data;
          // Request a page with no data and extract `page.total`
          const { total } = await context.service.find({
            query: {
              fieldA,
              fieldB,
              $limit: 0
            }
          });
    
          if(total > 0) {
            throw new Conflict('Unique fields fieldA and fieldB already exist');
          }
    
          return context;
        }]
      }
    })
    

    【讨论】:

    • 你好达夫,谢谢你的回答。出于性能考虑,我将继续将 MongoDB 索引用于此类目的。
    • @Daff 使用数据库唯一性系统来提高性能是一个不错的选择。但是,如何正确处理错误并以我们想要的方式显示信息?使用错误钩子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多