我对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;
行开始
你知道我如何更新代码来克服这个错误吗?
任何帮助都非常感谢。谢谢。
1条答案
按热度按时间bzzcjhmw1#
existingUser
没有定义,你试图解构它。相反,你必须解构你上面得到的findUser
也不要解构
email
,因为你已经在上面使用它从数据库中找到了它。如果你这样做,这可能会破坏let findUser = await User.findOne({ email });
行,因为你试图在函数内部初始化之前访问email
(在本例中,初始化是解构const {_id, name, email, role} = findUser
)。如果你真的需要解构电子邮件,你可以做一些像
现在您可以从那里开始使用
emailFromDb