gpt4 book ai didi

javascript - 正确使用 promise await 和 async 函数

转载 作者:行者123 更新时间:2023-11-29 10:59:04 25 4
gpt4 key购买 nike

router.post("/register", function (req, res) {

console.log(req.body);

// generate a salt
(async function(){


const salt = await bcrypt.genSalt(10);

// hash the password along with our new salt
const hash = await bcrypt.hash(req.body.txtPassword1, salt);
return hash;
})().then((data)=>{
var txtPassword = data;
let newUser = new userModel({
userName: req.body.txtUserName,
email: req.body.txtEmail,
profilePic: req.body.txtFileUpload,
password: txtPassword,
isAdmin: false

});
newUser.save((function (err) {
if (err) {
console.log("failed to save the new User ! : ", err);

} else {
console.log("New user has been added successfully with Id", newUser._id);
}
}))

req.flash('success', 'Registeration Successful');

console.log("Session value ", req.session);
console.log("value of txt password => ", txtPassword)
res.render("blogHome", { title: "Blogs || Home" });
});


});

我想知道这是否是使用 await 的正确方法。我不得不求助于这种方式,因为当我只是尝试使用

var hash = await bcrypt.hash(req.body.txtPassword1,salt);

当我使用上面的代码时,我遇到了意外的标识符错误,当我用谷歌搜索时,我发现await 必须在异步函数中使用,所以我将整个东西包装在一个 IIFE 中,并使用 .then() 进行正常的 promise 处理但是不知不觉我把一个简单的事情复杂化了。谁能指出最简单的方法来做到这一点。我被迫使用 promise 的原因是因为异步执行数据库保存语句总是在计算哈希之前执行,这意味着密码为空,这反过来会触发密码字段的模式验证

最佳答案

这是正确的,除了你没有处理错误,这是你需要做的 - 否则,现在,你会在控制台中收到“未处理的拒绝”错误,并且对于即将推出的某些 Node.js 版本,它'我将终止未处理拒绝的过程。

But I feel unknowingly I have complicated a simple thing .

:-) 那是因为您正在处理一些基于 promise 的事情和一些基于旧式节点回调的事情。但是你可以通过 promise 旧式回调的东西来让它更干净。

假设您更新了 newUserModel.save,因此它返回了一个 promise 而不是 Node 风格的回调。然后:

router.post("/register", function (req, res) {
// generate a salt
(async function(){
const salt = await bcrypt.genSalt(10);

// hash the password along with our new salt
const txtPassword = await bcrypt.hash(req.body.txtPassword1, salt);
let newUser = new userModel({
userName: req.body.txtUserName,
email: req.body.txtEmail,
profilePic: req.body.txtFileUpload,
password: txtPassword,
isAdmin: false

});
await newUser.save(); // *** Assumes a new promise-enabled `save`
console.log("New user has been added successfully with Id", newUser._id);

req.flash('success', 'Registeration Successful');

console.log("Session value ", req.session);
console.log("value of txt password => ", txtPassword)
res.render("blogHome", { title: "Blogs || Home" });
})().catch(err => {
// handle error
});
});

如果这是 Express,您还可以查看 Koa (来自同一个人),这使您可以使整个 post 回调 async 并同时正确处理错误(使用中间件)。

关于javascript - 正确使用 promise await 和 async 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50791437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com