Node.js 请建议一种更好的方法来编写此代码,而不必进行回调

Node.js 请建议一种更好的方法来编写此代码,而不必进行回调,node.js,mongoose,callback,nested,Node.js,Mongoose,Callback,Nested,由于某些原因,这里的猫鼬调用2依赖于猫鼬调用1。虽然代码是工作,但我希望它是正确的框架。因此,请建议一种更好的方法。我希望我澄清了这个问题。 谢谢 PS:我是NODE.js的新手,使用async/await会让您受益匪浅,尤其是使用涉及不同异步执行分支的条件。它还使不同异步代码路径的集中错误处理变得更容易: router.get('/:id',ensureLogin,(req,res)=>{ somemodel.findOne({...}) ****//mongoose call

由于某些原因,这里的猫鼬调用2依赖于猫鼬调用1。虽然代码是工作,但我希望它是正确的框架。因此,请建议一种更好的方法。我希望我澄清了这个问题。 谢谢
PS:我是NODE.js的新手,使用
async/await
会让您受益匪浅,尤其是使用涉及不同异步执行分支的条件。它还使不同异步代码路径的集中错误处理变得更容易:

router.get('/:id',ensureLogin,(req,res)=>{

    somemodel.findOne({...}) ****//mongoose call 1****
    .then(result=>{
   
        if(some condition){
            User.findOne(some condition) ***//mongoose call 2***
            .then(result=>{
                 //Some code is to be executed here using the "User.findOne..."
                }
                res.render('some template')
            .catch(err=>{
                console.log(err)
            })
        }
        else{
            res.render('some another template');
        }
    })
    .catch(err=>{
        res.render('error/500');
    })    
})

很多Node.js调用的异步特性一开始可能会让人非常困惑,但您很快就习惯了,并意识到这是一项伟大的技术

我建议使用语法,这使代码更像同步代码。这当然使它更容易遵循

我会将代码重构为如下内容:

router.get('/:id', ensureLogin, async (req,res) => {
    try {
        let result = await somemodel.findOne({...});
        if(some condition){
            let secondResult = await User.findOne(some condition);
            //Some code is to be executed here using the "User.findOne..."
            res.render('some template')
        } else {
            res.render('some another template');
        }
    } catch(e) {
        res.render('error/500');
    }    
}
,请调查一下@诺克斯
router.get('/:id', ensureLogin, async (req,res) => {
    try { 
        let result = await somemodel.findOne({/* search criteria */});
        if (someCondition(result)) {
            let user = await User.findOne({/* search criteria */})
            res.render('some template');   
        } else { 
            res.render('some another template');
        }
    } catch (error) {
        res.render('error/500');
    }
})