Я все еще новичок в разработке стека 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
должна быть переменной user
. Эквивалентом ` let findUser = await User.findOne({ email });
в исходном коде является User.findOne({ email }).exec((err, user) => {}
Пользовательские данные из БД находятся в переменной findUser
.
попробуй const {_id, name, role} = findUser;
. Я удалил электронную почту, так как она у вас уже есть. Кстати, а зачем тебе эта строка? У него нет использования.
также, если вы собираетесь деструктурировать электронную почту, строка let findUser = await User.findOne({ email });
может сломаться
Привет @SuleymanSah Мне понадобится email
, потому что я сделаю return res.json({ token, findUser: { _id, name, email, role } });
в окончательном заявлении о возврате.
@redshot я думаю, что он имел в виду, что у вас уже есть электронная почта, так как вы находите по электронной почте
@cmgchess Ты прав. Теперь я получаю правильный вывод. Можете ли вы написать свой ответ на комментарий, чтобы я мог проголосовать за него?
@SuleymanSah Можете ли вы написать свой комментарий в качестве ответа? Мой код работает сейчас.
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
оттуда и далее
Спасибо за ваши усилия по предоставлению правильного кода. Это сработало!
Привет @cmgchess
existingUser
— это новая переменная. Насколько я понял,const {_id, name, email, role} = existingUser
называется деструктированием.