mongoose Chaining with then and catch

时间:2018-01-25 23:12:04

标签: javascript mongoose

如何将此函数转换为使用then和catch进行链接? 链接更好吗?
我的意思是User.findOne().then().catch()

User.findOne({_id: msg.chat.id}, (err, doc) => {
    if (err) {
      console.log(err);
    }

    if (doc) {
      console.log(doc.name);
    } else {
      console.log('Empty');
    }
  });

2 个答案:

答案 0 :(得分:3)

如果操作成功,则使用返回的文档调用传递给then的函数(或为null),如果操作失败(例如,没有连接),则调用catch并返回错误。把它放在一起看起来像这样:

User.findOne({_id: msg.chat.id})
    .then(doc => {
        if (doc) {
            console.log(doc.name);
        } else {
            console.log('Empty');
        }
    }).catch(err => {
        if (err) {
            console.log(err);
        } 
    });

顺便说一句,当您按ID搜索一个文档时,您可以使用findById

User.findById(msg.chat.id)
    .then(doc => {
        if (doc) {
            console.log(doc.name);
        } else {
            console.log('Empty');
        }
    }).catch(err => {
        if (err) {
            console.log(err);
        } 
    });

答案 1 :(得分:1)

最好切换到ES2017 async/await语法,你可以避免承诺地狱

async function foo () {
    try {
        var doc = await User.findOne({_id: msg.chat.id}).exec()         
        if (doc)
            return console.log(doc.name);
        console.log('Empty');    
    } catch (err) { console.log(err) }
}

foo()

当您进行DB来电或使用for...loops时,这会对您有所帮助。

async function foo () {
    try {
        var users = await User.find({}).exec()

        for (var user in users) {
            var tweets = await Tweet.find({_user: user._id}).exec()
            user.tweets = tweets.map(t => t.text)
            await user.save() 
        }

    } catch (err) { console.log(err) }
}

foo()