Как мне решить Не удается получить доступ к «электронной почте» до инициализации?

Я все еще новичок в разработке стека MERN. У меня есть конечная точка http://localhost:8000/api/signin, где отправляются электронная почта и пароль. Серверный код сначала проверяет, сохранен ли пользователь уже в MongoDB, после чего пароль, отправленный в конечной точке, будет сравниваться с паролем, сохраненным в базе данных (mongodb).

/контроллеры/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.info('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.info(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;

У вас есть идеи, как я могу обновить свой код, чтобы устранить ошибку?

Любая помощь приветствуется. Спасибо.

Привет @cmgchess existingUser — это новая переменная. Насколько я понял, const {_id, name, email, role} = existingUser называется деструктированием.

redshot 19.04.2023 15:19

но тогда уже существующий пользователь не определен. вы получаете это из БД или что-то

cmgchess 19.04.2023 15:20

@cmgchess На самом деле, я следую учебнику. Старый код использовал обратные вызовы, и это вызовет ошибки с сегодняшней версией пакетов. Затем я преобразовал код в асинхронное ожидание. Переменная existingUser должна быть переменной user. Эквивалентом ` let findUser = await User.findOne({ email }); в исходном коде является User.findOne({ email }).exec((err, user) => {}

redshot 19.04.2023 15:28

Пользовательские данные из БД находятся в переменной findUser.

Prerak Sola 19.04.2023 15:29

попробуй const {_id, name, role} = findUser;. Я удалил электронную почту, так как она у вас уже есть. Кстати, а зачем тебе эта строка? У него нет использования.

SuleymanSah 19.04.2023 15:31

также, если вы собираетесь деструктурировать электронную почту, строка let findUser = await User.findOne({ email }); может сломаться

cmgchess 19.04.2023 15:33

Привет @SuleymanSah Мне понадобится email, потому что я сделаю return res.json({ token, findUser: { _id, name, email, role } }); в окончательном заявлении о возврате.

redshot 19.04.2023 15:33

@redshot я думаю, что он имел в виду, что у вас уже есть электронная почта, так как вы находите по электронной почте

cmgchess 19.04.2023 15:34

@cmgchess Ты прав. Теперь я получаю правильный вывод. Можете ли вы написать свой ответ на комментарий, чтобы я мог проголосовать за него?

redshot 19.04.2023 15:38

@SuleymanSah Можете ли вы написать свой комментарий в качестве ответа? Мой код работает сейчас.

redshot 19.04.2023 15:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
10
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 оттуда и далее

Спасибо за ваши усилия по предоставлению правильного кода. Это сработало!

redshot 19.04.2023 16:28

Другие вопросы по теме