【问题标题】:Node Async/Await not working and need to implement call back节点异步/等待不工作,需要实现回调
【发布时间】:2020-05-15 18:13:06
【问题描述】:

看看我的控制器

exports.userList = async (req, res) => {
   let result = await Methods.getAllData(Campaign)
   await console.log(result, 'tr')
}

这里Methods.getAllData是一个获取所有用户数据的函数,参数Campaign是我的模型名称。

这里是函数..

methods.getAllData = (modelName)=>{
    modelName.findAll({
    }).then(value=>{
        console.log(value, 'rt')
        return value
    }).catch(err=>{
        return err
    })
}
  1. 我的 console.log 语句首先运行。我曾尝试使用 aync/await 解决但无法正常工作。我需要得到结果,然后我需要安慰它。

  2. 这里我已经返回了数据,如何使用回调代替返回?

【问题讨论】:

  • 你只需要返回findAll --- return modelName.findAll(....)

标签: node.js express


【解决方案1】:

你只需要从getAllData返回promise

const getAllData = (modelName)=>{
  return  modelName.findAll();
}

exports.userList = (req, res) => {
   const newPromise = getAllData(Campaign);

   newPromise
     .then( result => console.log('result',result))
     .catch( err => console.log('error', err))

}

【讨论】:

  • 如果您在我的回答的帮助下解决了您的问题,那么您可以将其作为已接受的问题。
  • 如果您还有其他问题,请告诉我。
【解决方案2】:

您需要做的就是返回由findAll() 生成的承诺。您无需更改代码中的任何其他内容:

methods.getAllData = (modelName)=>{
    return modelName.findAll({ // ---------------- this is the  bug fix
    }).then(value=>{
        console.log(value, 'rt')
        return value
    }).catch(err=>{
        return err
    })
}

但是,从这样的 catch 返回是不好的做法,因为它将错误转换为常规返回值。要么重新抛出错误:

    }).catch(err=>{
        throw err
    }) 

或者不要在这里捕获错误:

methods.getAllData = (modelName)=>{
    return modelName.findAll({ // ---------------- this is the  bug fix
    }).then(value=>{
        console.log(value, 'rt')
        return value
    }) // ---------------------------------------- remove catch
}

【讨论】:

    【解决方案3】:

    您可以使用以下代码更改您的 getAllData 方法:

    更新:

    methods.getAllData = (modelName)=>{
      return modelName.findAll();
    }
    

    在你的userList 中,你可以像下面这样的代码:

    exports.userList = async (req, res) => {
      try {
        let result = await Methods.getAllData(Campaign);
        console.log(result);
      } catch(ex) {
        console.log(ex.message);
      }
    }
    

    希望对你有帮助。

    【讨论】:

    • 函数findAll 已经返回了一个promise。不要将其包装在另一个承诺中 - 这是一种反模式
    • 函数findAll 已经返回了一个promise。你不需要等待它。直接退货
    • @Rabbani_ 你的错误是你忘记了返回承诺。你调用了一个返回承诺的函数,然后你什么都不返回
    • 可能有其他原因,例如无论谁调用getAllData(),OP 似乎总是在findAll() 上运行then()。或者它可能只是遵循特定的设计模式,例如不允许您直接调用数据库函数的存储库模式等。无论如何,您也在“创建另一个函数来放入模型” - 您的论点与您自己的答案背道而驰。在 Promise 构造函数中包装 Promise 是众所周知的反模式和糟糕的编码实践:stackoverflow.com/questions/53910226/…
    • @slebetman:谢谢你的建议。我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2021-06-30
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多