mongodb 如何解决初始化前无法访问“email”的问题?

9avjhtql  于 2023-04-20  发布在  Go
关注(0)|答案(1)|浏览(156)

我对MERN堆栈开发还是个新手。我有一个http://localhost:8000/api/signin端点,在那里提交电子邮件和密码。后端代码首先检查用户是否已经保存在MongoDB中,然后将端点中提交的密码与数据库(mongoDB)中保存的密码进行比较。

/controllers/auth.js

exports.signin = (req, res) => {
  const { email, password } = req.body;
  const signInUser = async () => {
    try {
      // Check if user exists
      let findUser = await User.findOne({ email }); // promise is the new way of doing this instead of callback as of express 4.18 and mongoose 7.0.3

      console.log('findUser', findUser);

      if (!findUser) {
        return res.status(400).json({
          error: 'User with that email does not exist. Please signup'
        })
      }

      // authenticate
      if (!findUser.authenticate(password)) {
        return res.status(400).json({
          error: 'Email and password do not match'
        })
      }

      // generate a token and send to client
      const token = jwt.sign({_id: findUser._id}, process.env.JWT_SECRET, { expiresIn: '7d' });
      const {_id, name, email, role} = existingUser;

     return res.json({
      message: 'Yey!'
     })
    } catch (error) {
      console.log(error); // Sometimes this error is not displayed on postman

      return res.status(400).json({
        error: 'Something went wrong'
      })
    }
  }

  signInUser();
};

问题:我现在看到一个ReferenceError: Cannot access 'email' before initialization错误。我认为错误从const {_id, name, email, role} = existingUser;行开始
你知道我如何更新代码来克服这个错误吗?
任何帮助都非常感谢。谢谢。

bzzcjhmw

bzzcjhmw1#

existingUser没有定义,你试图解构它。相反,你必须解构你上面得到的findUser

const {_id, name, role} = findUser;

也不要解构email,因为你已经在上面使用它从数据库中找到了它。如果你这样做,这可能会破坏let findUser = await User.findOne({ email });行,因为你试图在函数内部初始化之前访问email(在本例中,初始化是解构const {_id, name, email, role} = findUser)。
如果你真的需要解构电子邮件,你可以做一些像

{_id, name, email: emailFromDb, role} = findUser.

现在您可以从那里开始使用emailFromDb

相关问题