Javascript 承诺待定的韩元';我不能决定或拒绝
我有一个更新密码功能,可以更新用户的密码并删除生成的一次性URL。当前,它向前端返回一个空响应,变量Javascript 承诺待定的韩元';我不能决定或拒绝,javascript,node.js,azure-functions,Javascript,Node.js,Azure Functions,我有一个更新密码功能,可以更新用户的密码并删除生成的一次性URL。当前,它向前端返回一个空响应,变量updatedResult表示Promise pending,因此这似乎是空响应的问题。当我执行代码时,这就是输出。我在两个地方添加了updateResultconsole.log()输出来引用它的输出: 代码也可以工作。我的密码更新了,我可以用新密码登录,但由于这个承诺问题,我没有得到回复 USER IS $2b$10$VBjWX9KPX2dVMVcdFASFSDFbG9XjONHqe0bJDj
updatedResult
表示Promise pending,因此这似乎是空响应的问题。当我执行代码时,这就是输出。我在两个地方添加了updateResult
console.log()输出来引用它的输出:
代码也可以工作。我的密码更新了,我可以用新密码登录,但由于这个承诺问题,我没有得到回复
USER IS $2b$10$VBjWX9KPX2dVMVcdFASFSDFbG9XjONHqe0bJDjKUvY/S7/gSC4sPbhIekBTa
[4/15/2020 3:21:22 PM] JSON.stringify(payload)
[4/15/2020 3:21:22 PM] {"id":"5e92133edab88409dc4d1219","email":"bob@gmail.com","iat":1586963845,"exp":1586963945}
[4/15/2020 3:21:22 PM] updated Result From Here
[4/15/2020 3:21:22 PM] Promise { <pending> }
[4/15/2020 3:21:22 PM] Executed 'Functions.PATCH-PWReset-Update' (Succeeded, Id=2fd8968c-fcad-4db0-a5e4-3ab7f41700e6)
[4/15/2020 3:21:22 PM] Executed HTTP request: {
[4/15/2020 3:21:22 PM] "requestId": "5ae5c23c-3861-4594-81f3-18de4a8631d1",
[4/15/2020 3:21:22 PM] "method": "PATCH",
[4/15/2020 3:21:22 PM] "uri": "/api/PATCH-PWReset-Update",
[4/15/2020 3:21:22 PM] "identities": [
[4/15/2020 3:21:22 PM] {
[4/15/2020 3:21:22 PM] "type": "WebJobsAuthLevel",
[4/15/2020 3:21:22 PM] "level": "Admin"
[4/15/2020 3:21:22 PM] }
[4/15/2020 3:21:22 PM] ],
[4/15/2020 3:21:22 PM] "status": 200,
[4/15/2020 3:21:22 PM] "duration": 722
[4/15/2020 3:21:22 PM] }
[4/15/2020 3:21:22 PM] updatedResult
[4/15/2020 3:21:22 PM] Promise { <pending> }
[4/15/2020 3:21:25 PM] Host lock lease acquired by instance ID '000000000000000000000000179CDB79'.
Url.findOneAndDelete({Url:generatedUrl})。然后(documents=>{
console.log(“updateResult”);
console.log(updatedResult);
你必须等待UpdateResult承诺,你可以
updateResult.then(值=>{
//…剩下的逻辑。。。
})
或者等待两个承诺完成
Promise.all([
findOneAndDelete({Url:generatedUrl}),
更新结果
]).然后(([文档,值])=>{
//…剩下的逻辑。。。
})
我从您的代码中得到的是:
- 您正在查找用户
- 然后并行更新密码和一次性URL
const updatedResult = new Promise((resolve, reject) => {
bcrypt.hash(req.body.password, 10, function(error, hash) {
if (error) {
reject(error);
}
newPasswordHash = hash;
// res.sendStatus(401);
try {
const updated = User.updateOne({ password: newPasswordHash });
resolve(updated);
} catch (err) {
reject(err);
}
reject();
});
});
为了以一种干净的方式进行,我建议创建一个单独的函数,并从中调用db操作。类似如下:
module.exports = function(context, req) {
// TODO: Fetch user from database using
User.findById(req.body.id)
.then((res) => {
console.log('USER IS ' + res.password);
var secret = res.password + '-' + res.passwordCreated.getTime();
var payload = jwt.decode(req.body.token, secret);
return Promise.all([updatePassword(req), deleteOneTimeUrl(req)]);
})
.then((result) => {
context.json = {
status: 200,
body: {
message: 'Password updated!',
},
headers: {
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
'Access-Control-Max-Age': '86400',
Vary: 'Accept-Encoding, Origin',
'Content-Type': 'application/json',
},
};
context.done();
})
.catch((err) => {
context.res = {
status: 500,
headers: {
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
'Access-Control-Max-Age': '86400',
Vary: 'Accept-Encoding, Origin',
'Content-Type': 'application/json',
},
};
if (err.errorCode == 'DELETE_FAIL')
context.res.body = {
message: 'ONE TIME URL DELETE ERROR',
error: err.error,
};
else
context.res.body = {
message: 'PW Update Failed!',
};
context.done();
});
};
function deleteOneTimeUrl(req) {
let generatedUrl = `http://localhost:4200/resetpassword/${req.body.id}/${req.body.token}`;
return Url.findOneAndDelete({ url: generatedUrl })
.then(res => { return Promise.resolve(res);})
.catch((error) => {
return Promise.reject({ errorCode: 'DELETE_FAIL', error: error });
});
}
function updatePassword(req) {
return new Promise((resolve, reject) => {
bcrypt.hash(req.body.password, 10, function(error, hash) {
if (error) {
reject({ errorCode: 'UPDATE_FAIL', error: error });
}
newPasswordHash = hash;
// res.sendStatus(401);
try {
const updated = User.updateOne({ password: newPasswordHash });
resolve(updated);
} catch (err) {
reject({ errorCode: 'UPDATE_FAIL', error: error });
}
reject({ errorCode: 'UPDATE_FAIL' });
});
});
}
你能不能把它简化为一个。既然
updatedResult=newpromise
,为什么你看不到一个承诺呢?你从来没有在等待updatedResult
承诺,那么你为什么还要看到其他东西呢?应该是const updatedResult=wait newpromise(…
(记住标记为async
函数)我让它工作等待和异步,但我试图不使用它。我正在使用azure函数,但我还无法将异步函数返回到angular。我尝试了不同的代码,所有这些都在我的nodejs后端工作,返回到angular没有问题,但我移植的azure函数版本没有问题,因此我必须将它们转换为angularo.然后承诺让它玩得很好。在我更改它之前看起来是这样的:除了上面提到的,我相信User.updateOne
会返回一个承诺,所以你必须在它的末尾链接一个,然后
。谢谢你的例子!但是我得到一个错误:TypeError:PromiseResolve调用了非object
>这是完整的日志:你知道为什么吗?你需要从deleteOneTimeUrl
函数返回一个承诺。我已经在代码中进行了更正。效果很好。谢谢你的帮助和解释!
module.exports = function(context, req) {
// TODO: Fetch user from database using
User.findById(req.body.id)
.then((res) => {
console.log('USER IS ' + res.password);
var secret = res.password + '-' + res.passwordCreated.getTime();
var payload = jwt.decode(req.body.token, secret);
return Promise.all([updatePassword(req), deleteOneTimeUrl(req)]);
})
.then((result) => {
context.json = {
status: 200,
body: {
message: 'Password updated!',
},
headers: {
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
'Access-Control-Max-Age': '86400',
Vary: 'Accept-Encoding, Origin',
'Content-Type': 'application/json',
},
};
context.done();
})
.catch((err) => {
context.res = {
status: 500,
headers: {
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
'Access-Control-Max-Age': '86400',
Vary: 'Accept-Encoding, Origin',
'Content-Type': 'application/json',
},
};
if (err.errorCode == 'DELETE_FAIL')
context.res.body = {
message: 'ONE TIME URL DELETE ERROR',
error: err.error,
};
else
context.res.body = {
message: 'PW Update Failed!',
};
context.done();
});
};
function deleteOneTimeUrl(req) {
let generatedUrl = `http://localhost:4200/resetpassword/${req.body.id}/${req.body.token}`;
return Url.findOneAndDelete({ url: generatedUrl })
.then(res => { return Promise.resolve(res);})
.catch((error) => {
return Promise.reject({ errorCode: 'DELETE_FAIL', error: error });
});
}
function updatePassword(req) {
return new Promise((resolve, reject) => {
bcrypt.hash(req.body.password, 10, function(error, hash) {
if (error) {
reject({ errorCode: 'UPDATE_FAIL', error: error });
}
newPasswordHash = hash;
// res.sendStatus(401);
try {
const updated = User.updateOne({ password: newPasswordHash });
resolve(updated);
} catch (err) {
reject({ errorCode: 'UPDATE_FAIL', error: error });
}
reject({ errorCode: 'UPDATE_FAIL' });
});
});
}