嗨,我是javascript编程的新手。
我有一个节点快速项目,我正在尝试在AuthenticationController类中创建一个登录方法。
我的登录方法现在是这样的:
const User = require('../models/User')
class AuthenticationController {
async login(req, res) {
const { email, password } = req.body
console.log('step 1')
var hashPassword = await userPassword(email)
console.log(hashPassword)
console.log('step 2')
return res.status(200).json({ 'msg': 'Log in OK!' })
}
userPassword(email) {
User.findOne({ email: email }).exec(function(err, user) {
if (err) return err
else return user.password
})
}
}
但是我收到一条错误消息,说userPassword是未定义的,我不知道为什么。所以我的疑问是:为什么会这样,以及如何正确进行?
我也检查了这个问题,但是他们没有帮助我
控制台上的错误消息:
(节点:28968)UnhandledPromiseRejectionWarning:ReferenceError:未定义userPassword ...
(节点:28968)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1)
(节点:28968)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。
答案 0 :(得分:2)
login
不是指userPassword
方法,而是指不存在的同名函数。
应该将承诺链接在一起,而不会。 userPassword
有望返回承诺,但它使用了过时的Mongoose回调API。
显示UnhandledPromiseRejectionWarning
意味着login
中的错误没有得到正确处理。如this answer中所述,Express不支持诺言,因此开发人员应处理错误。
应该是:
async login(req, res) {
try {
const { email, password } = req.body
var hashPassword = await this.userPassword(email)
return res.status(200).json({ 'msg': 'Log in OK!' })
} catch (err) {
// handle error
}
}
async userPassword(email) {
const { password } = await User.findOne({ email: email });
return password;
}
答案 1 :(得分:0)
此错误即将到来,因为您没有为诺言处理错误。始终在try / catch块中使用async / await。
try{
async login(req, res) {
const { email, password } = req.body
console.log('step 1')
var hashPassword = await userPassword(email)
console.log(hashPassword)
console.log('step 2')
return res.status(200).json({ 'msg': 'Log in OK!' })
}
}catch(e){
console.log(e)
}