NodeJS:更改密码期间出现UnhandledPromiseRejectionWarning
NodeJS: UnhandledPromiseRejectionWarning during changing password
我正在 NodeJS 中更改密码,在请求处理期间出现以下错误:
(node:16220) UnhandledPromiseRejectionWarning: Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:267:15)
at user.(anonymous function).updateOne.then.catch.err (/home/pbaj/Documents/Projects/syberiaquotes-backend/api/controllers/user.js:284:52)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
(node:16220) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:16220) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
在我的 changePassword
路线中,我采用 email,password,newPassword
值并且:
正在检查电子邮件是否存在,如果存在...
比较给定的密码和用户密码,如果相同...
bcrypt.hash
函数获取新密码,从中生成哈希值,并保存到 mongoDB
如果我提供正确的电子邮件和密码,则上述所有步骤都已完成,但我明白了 UnhandledPromiseRejectionWarning
。
我看到这个问题的原因在 user[0].updateOne(user[0])
函数内部,正好在 catch()
中,但我不知道发生了什么。
// CHANGE USER PASSWORD
exports.changePassword = (req, res, next) => {
User.find({ email: req.body.email })
.then(user => {
if (user.length < 1) {
return res.status(401).json({
message: 'Auth failed'
})
}
const { password, newPassword } = req.body
console.log(password, newPassword)
bcrypt.compare(req.body.password, user[0].password, (err, result) => {
console.log(result)
if (err) {
return res.status(401).json({
message: 'Error! Something goes wrong'
})
}
if (result) {
bcrypt.hash(newPassword, 10, (err, hash) => {
console.log(hash)
if (err) {
return res.status(500).json({
error: err
})
} else {
user[0].password = hash
user[0]
.updateOne(user[0])
.then(result => {
return res.status(200).json({
message: 'Password changed!',
result: result,
})
})
.catch(err => {
res.status(500).json({ message: err.message })
})
}
})
}
return res.status(401).json({
message: 'Auth failed'
})
})
})
.catch(err => {
res.status(500).json({ error: err })
})
}
我需要从我的请求中得到 [200]'Password changed!'
答复,但由于 UnhandledPromiseRejectionWarning
.
,我得到 [401]'Auth failed'
我假设您使用的是 Mongoose(因为 User.find(...)
)。
如果是这样的话,你不能做user[0].updateOne(...)
,因为user[0]
已经是User
类型的对象了。
您要么 User.findOneAndUpdate(...)
,要么在设置新密码后 user[0].save(...)
(这对我来说似乎更直接)。
您发送了 2 次回复。试试这个代码
if (result) {
bcrypt.hash(newPassword, 10, (err, hash) => {
console.log(hash)
if (err) {
return res.status(500).json({
error: err
})
} else {
user[0].password = hash
user[0]
.updateOne(user[0])
.then(result => {
return res.status(200).json({
message: 'Password changed!',
result: result,
})
})
.catch(err => {
res.status(500).json({ message: err.message })
})
}
})
} else {
return res.status(401).json({
message: 'Auth failed'
})
}
我正在 NodeJS 中更改密码,在请求处理期间出现以下错误:
(node:16220) UnhandledPromiseRejectionWarning: Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/home/pbaj/Documents/Projects/syberiaquotes-backend/node_modules/express/lib/response.js:267:15)
at user.(anonymous function).updateOne.then.catch.err (/home/pbaj/Documents/Projects/syberiaquotes-backend/api/controllers/user.js:284:52)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
(node:16220) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:16220) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
在我的 changePassword
路线中,我采用 email,password,newPassword
值并且:
正在检查电子邮件是否存在,如果存在...
比较给定的密码和用户密码,如果相同...
bcrypt.hash
函数获取新密码,从中生成哈希值,并保存到 mongoDB
如果我提供正确的电子邮件和密码,则上述所有步骤都已完成,但我明白了 UnhandledPromiseRejectionWarning
。
我看到这个问题的原因在 user[0].updateOne(user[0])
函数内部,正好在 catch()
中,但我不知道发生了什么。
// CHANGE USER PASSWORD
exports.changePassword = (req, res, next) => {
User.find({ email: req.body.email })
.then(user => {
if (user.length < 1) {
return res.status(401).json({
message: 'Auth failed'
})
}
const { password, newPassword } = req.body
console.log(password, newPassword)
bcrypt.compare(req.body.password, user[0].password, (err, result) => {
console.log(result)
if (err) {
return res.status(401).json({
message: 'Error! Something goes wrong'
})
}
if (result) {
bcrypt.hash(newPassword, 10, (err, hash) => {
console.log(hash)
if (err) {
return res.status(500).json({
error: err
})
} else {
user[0].password = hash
user[0]
.updateOne(user[0])
.then(result => {
return res.status(200).json({
message: 'Password changed!',
result: result,
})
})
.catch(err => {
res.status(500).json({ message: err.message })
})
}
})
}
return res.status(401).json({
message: 'Auth failed'
})
})
})
.catch(err => {
res.status(500).json({ error: err })
})
}
我需要从我的请求中得到 [200]'Password changed!'
答复,但由于 UnhandledPromiseRejectionWarning
.
[401]'Auth failed'
我假设您使用的是 Mongoose(因为 User.find(...)
)。
如果是这样的话,你不能做user[0].updateOne(...)
,因为user[0]
已经是User
类型的对象了。
您要么 User.findOneAndUpdate(...)
,要么在设置新密码后 user[0].save(...)
(这对我来说似乎更直接)。
您发送了 2 次回复。试试这个代码
if (result) {
bcrypt.hash(newPassword, 10, (err, hash) => {
console.log(hash)
if (err) {
return res.status(500).json({
error: err
})
} else {
user[0].password = hash
user[0]
.updateOne(user[0])
.then(result => {
return res.status(200).json({
message: 'Password changed!',
result: result,
})
})
.catch(err => {
res.status(500).json({ message: err.message })
})
}
})
} else {
return res.status(401).json({
message: 'Auth failed'
})
}