【问题标题】:How to update multiple mongo collections inside the same function in spring webflux?如何在spring webflux的同一函数中更新多个mongo集合?
【发布时间】:2019-12-31 22:27:15
【问题描述】:

我的 mongoDB 中有 2 个集合:

1.users集合,包含用户电话号码,是否经过验证?

{
   _id: '12123',
   phones: [ 
      {
         phoneNumber: '1234567890',
         verified: false
      }
   ]
}

2. verificationTokens 集合,其中包含由用户集合中的 id 映射为 userId 的验证码。

{
   _id: '1111',
   userId: '12123',
   token: '4545'
}


我正在 Spring WebFlux 中创建一个端点来验证电话号码。端点接收 userIdverificationCode。如果集合中的token与用户发送的token匹配,则在用户集合中更新verified为true。

我正在尝试编写一个将由该端点调用并进行所需更改的函数。

我尝试了以下代码,但验证状态未更新为 true。

   public Mono<VerifyPhoneToken> verifyPhoneNumber(String id, String verificationCode) {
        return verifyPhoneTokensRepository.findByUserId(id)
                .flatMap(vpt -> {
                    if (verificationCode.equals(vpt.getToken())) {
                        usersRepository.findById(id)
                                .flatMap(user -> {
                                    user.getPhones().get(0).setVerified(true);
                                    return usersRepository.save(user);
                                });
                        return verifyPhoneTokensRepository.save(vpt);
                    }
                    return null;
                });
    }

另外,我想知道return null 是否可以以更好的方式处理。

【问题讨论】:

  • 你不应该返回null,你应该返回一个mono.empty()

标签: java mongodb spring-webflux


【解决方案1】:

我猜你的问题是当你调用usersRepository 时你没有处理返回从而破坏了事件链。您应该尝试以下方法:

public Mono<VerifyPhoneToken> verifyPhoneNumber(String id, String verificationCode) {
    return verifyPhoneTokensRepository.findByUserId(id)
            .flatMap(vpt -> {
                if (verificationCode.equals(vpt.getToken())) {
                    return updateUser(id)
                            .then(verifyPhoneTokensRepository.save(vpt));
                }
                return Mono.empty();
            });
}

private Mono<User> updateUser(String id) {
    return usersRepository.findById(id)
            .flatMap(user -> {
                user.getPhones().get(0).setVerified(true);
                return usersRepository.save(user);
            });
}

使用then 链接您的操作。也不要返回null返回Mono&lt;Void&gt;(Mono.empty())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2019-02-16
    • 2020-03-18
    • 2018-05-18
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多