Javascript 将承诺连成一条链

Javascript 将承诺连成一条链,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我对Express和Mongo有一个登录逻辑。我需要将它们放在一个承诺链中,避免嵌套承诺 这是我的密码: const foundUser = User.findOne({ email: email }).exec(); const hashedPassword = bcrypt.hash(password, 10); return Promise.all([foundUser, hashedPassword]) .then(arr => {

我对Express和Mongo有一个登录逻辑。我需要将它们放在一个承诺链中,避免嵌套承诺

这是我的密码:

    const foundUser = User.findOne({ email: email }).exec();
    const hashedPassword = bcrypt.hash(password, 10);

    return Promise.all([foundUser, hashedPassword])
        .then(arr => {
            const [ user, hashedPassword ] = arr;

            if (user) {
                return res.status(400).json({
                    message: "This email has already occupied."
                });
            };

            const newUser = new User({
                fullName,
                email,
                password: hashedPassword
            });

            newUser.save()
            .then(user => {
                return res.status(200).json({
                    message: `${user.fullName}, you are successfully registered.`
                });
            })
            .catch(err => {
                console.log(err);
                return res.status(500);
            })
        })
        .catch(err => {
            console.log(err);
            return res.status(500);
        });
我尝试使用将它们与
Promise.all
组合,但我的一个承诺取决于前一个承诺,因此我在我的then中添加了
newUser.save()

我实现了异步/等待,如下所示:

const foundUser = await User.findOne({ email: email }).exec();

if (foundUser) {
    return res.status(400).json({
        message: "This email has already occupied."
    });
}

const hashedPassword = await bcrypt.hash(password, 10);

const newUser = new User({
    fullName,
    email,
    password: hashedPassword
});

const user = await newUser.save();

return res.status(200).json({
    message: `${user.fullName}, you are successfully registered.`
});

} catch (err) {
    console.log( err);
    return res.status(500).json({
        message: 'Error'
    })
}
但我想知道有没有一种方法可以做到既有承诺,又不筑巢。
我需要将它们放在一条链上,这样我就可以避免使用multiply-catch,正如@Bergi在评论中提到的那样,您可以从
回调中返回一个承诺。根据此返回的承诺是否得到解决或拒绝,将调用链中的下一个
。然后
。catch
。您可以这样做:

const foundUser = await User.findOne({ email: email }).exec();

if (foundUser) {
    return res.status(400).json({
        message: "This email has already occupied."
    });
}

const hashedPassword = await bcrypt.hash(password, 10);

const newUser = new User({
    fullName,
    email,
    password: hashedPassword
});

const user = await newUser.save();

return res.status(200).json({
    message: `${user.fullName}, you are successfully registered.`
});

} catch (err) {
    console.log( err);
    return res.status(500).json({
        message: 'Error'
    })
}
const foundUser=User.findOne({email:email}).exec();
const hashedPassword=bcrypt.hash(密码,10);
返回Promise.all([foundUser,hashedPassword])
。然后(arr=>{
const[user,hashedPassword]=arr;
如果(用户){
返回res.status(400).json({
消息:“此电子邮件已被占用。”
});
};
const newUser=新用户({
全名,
电子邮件,
密码:hashedPassword
});
返回newUser.save()
})
。然后(用户=>{
返回res.status(200).json({
消息:`${user.fullName},您已成功注册`
});
})
.catch(错误=>{
控制台日志(err);
返回资源状态(500);
});

为什么不改用async/await?@cadenzah是的,我知道,但我想用承诺来实现它。@RobertHovhannisyan
async
/
await
是承诺,只是一种比
更好的语法,如果你只是想避免多次捕获,那么