当前位置: 首页 > 知识库问答 >
问题:

反应:对Facebook登录呼叫Submit进行两次反应?

龙德义
2023-03-14

我正在创建一个登录页面使用反应,它允许用户使用Facebook,谷歌登录,或使用用户名和密码。我只是意识到,每次我使用Facebook登录时,都会两次调用onSubmit。只有Facebook身份验证导致此问题。正因为如此,我的后端验证被调用,并返回一个res.jsonmsg,这将在前端返回一个错误msg。如果用户决定使用Facebook登录,如何避免这种情况发生?我在社交媒体登录方面使用了反应-脸书-登录和反应-谷歌-登录。

facebook按钮

const handleFacebookLogin = async (res) => {
    dispatch(loginUser({ isFacebookId: res?.userID }));
  };

<FacebookLogin
              appId='code'
              callback={handleFacebookLogin}
              render={(renderProps) => (
                <button
                  onClick={renderProps.onClick}
                  className='w-full font-sans text-xs flex items-center focus:outline-none'
                >
                  <FontAwesomeIcon
                    icon={faFacebookF}
                    className='svg-size fill-current text-blue-600'
                  />
                  <span className='w-full'>Sign In with Facebook</span>
                </button>
              )}
            />

后端导出常量loginUser=async(req, res)=

  try {
    if (isFacebookId) {
      const chkUser = await userModel.findOne({ isFacebookId: isFacebookId });
      if (chkUser) {
        if (!chkUser.isActive) {
          return res.status(400).json({
            msg: `The account is not yet activated.
            \n Please check your email for account activation link.`,
            activation: true,
          });
        } else {
          return res.status(200).json({
            _id: chkUser._id,
            email: chkUser.email,
            username: chkUser.username,
            name: chkUser.name,
            isAdmin: chkUser.isAdmin,
            msg: 'Login Success',
            tokenId: createRefreshToken(chkUser._id),
          });
        }
      } else {
        return res.status(400).json({
          msg: 'This Facebook account is not register yet. Please register using this ',
          googleId: true,
        });
      }
    } else if (isGoogleId) {
      const chkUser = await userModel.findOne({ isGoogleId: isGoogleId });
      if (chkUser) {
        if (!chkUser.isActive) {
          return res.status(400).json({
            msg: `The account is not yet activated.
            \n Please check your email for account activation link.`,
            activation: true,
          });
        } else {
          return res.status(200).json({
            _id: chkUser._id,
            email: chkUser.email,
            username: chkUser.username,
            name: chkUser.name,
            isAdmin: chkUser.isAdmin,
            msg: 'Login Success',
            tokenId: createRefreshToken(chkUser._id),
          });
        }
      } else {
        return res.status(400).json({
          msg: 'This Google account is not register yet. Please register using this ',
          googleId: true,
        });
      }
    } else if (!username && !email) {
      console.log('ta3');
      return res.status(400).json({
        msg: 'Please Provide a Username or Email',
        username: true,
      });
    } else if (!password) {
      return res.status(400).json({
        msg: 'Please Provide a Password',
        password: true,
      });
    } else {
      if (username) {
        const isEmail = (val) => {
          var data =
            /(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/;
          return data.test(val);
        };

        if (isEmail(username) === true) {
          email = username;
        }

        let chkUsernameEmail = email
          ? { email: username }
          : { username: username };

        const chkUser = await userModel.findOne(chkUsernameEmail);

        if (!chkUser) {
          return res.status(400).json({
            msg: 'Invalid Username or Email',
            username: true,
          });
        } else {
          if (!chkUser.isActive) {
            return res.status(400).json({
              msg: `The account is not yet activated.
              \n Please check your email for account activation link.`,
              activation: true,
            });
          } else {
            if (chkUser && (await chkUser.matchPassword(password))) {
              res.json({
                _id: chkUser._id,
                email: chkUser.email,
                username: chkUser.username,
                name: chkUser.name,
                isAdmin: chkUser.isAdmin,
                msg: 'Login Success',
                tokenId: createRefreshToken(chkUser._id),
              });
            } else {
              return res.status(400).json({
                msg: 'Invalid Password',
                password: true,
              });
            }
          }
        }
      }
    }
  } catch (error) {
    res.status(500).json({ msg: error.message });
  }

共有1个答案

易弘亮
2023-03-14

我想在调用API时只需禁用UI上的按钮。

 类似资料:
  • 我想知道正常的java API调用(我的意思是没有I/O的方法)是否应该被线程化为“迷你阻塞调用”?是否可以像这样实现Reactive Streams(在返回Publisher之前调用方法): 而不是(在流中调用它) 此验证器仅用于示例。这种方法是否有任何缺点,或者这些方法在返回语句之前应该总是包含在流中?

  • 我已将JDK升级到版本17。现在,当我尝试在Quarkus上运行optaplanner来运行参数化单元测试时,我得到以下stacktrace: 在读了一点关于这种问题的内容后,我补充道 在以下部分中到我的Maven POM:Quarkus-maven-plugin config和maven-surefire-config 并且在配置文件本机的maven-故障安全-插件配置中: 它确实按预期工作:测

  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • 问题内容: 我正在尝试模拟一些基于反射的方法。您可以在下面看到详细信息, 被测课程 测试 } 要么 但是,测试失败,并显示NullPointerException。我知道我在嘲笑概念上做错了什么,但是我不明白这是什么。您能否对此加以说明,并建议我如何测试此方法? 谢谢。 问题答案: 您需要一个Method对象和一个Class对象。根据您的评论,Mockito无法模拟方法,因此您需要一个真正的方法。

  • 所以就像标题所说的,我的应用程序的主页因为某种原因渲染了两次,我不知道为什么。从我的浏览器路由器,我最初调用一个JS文件,从那里我调用我的HomePage组件和React路由器,但然后我的页面渲染两次,我不知道为什么。 我的浏览器路由器(index.js): 然后pp.js被称为: 然后我的主页组件(index.jsx): 和路线。js: 但是我的页面是这样渲染的: 我真的很困惑,所以任何建议都会

  • 我确信这是标准的,众所周知的行为,但我不知道如何修复它。每当我使用setState(在本例中是setTheirpokeOn)时,闭包运行两次。为了让它“一次”运行,我必须在顶部添加额外的变量,以检查它是否已经运行,如果已经运行,则将其设置为之前的状态。 有没有更好的方法,或者只运行一次?谢谢 澄清: 该组件位于useEffect内部,具有一个空的依赖性数组,因此我认为它应该只在mount上运行。钩