【问题标题】:helper function returning a result before logic is applied in expressjs在 expressjs 中应用逻辑之前返回结果的辅助函数
【发布时间】:2019-05-05 10:24:16
【问题描述】:

我有一个控制器,它调用辅助函数来做一些工作,但唯一的问题是辅助函数在执行其逻辑之前过早返回。

我想要的是等待辅助函数完成其任务并返回结果。

当我这样做时,是否建议在控制器方法上使用异步,如下所示?

控制器:

async MoveItems(req, res, next) {

const data = req.body; // json
const total_items = data.length;

let status = 400;
let err_msg = "";

if (total_items == 0 || data.constructor != Array) {
  err_msg = "Sorry, you must post/upload json";
} else {


  for (let counter = 0; counter <= total_items - 1; counter++) {
    // check the record now



    const validItem = await Helpers.validateItem(
      data[counter]
    );
    ValidItem is always now false if it is valid

    if (!validItem) {

      err_msg = `Invalid item found on row ${counter + 1}`;
      break;
    }
  }


}

res.status(status).send({ detail: err_msg });

}

我的助手:

export default {
  async validateItem(record) {


    const ItemID = +record["ItemID"];


    let response = false;

    db.Item.findAll({
      where: { ItemID },
      limit: 1
    })
      .then(item => {


        if (item.length === 1) {
         response = true;
        } 
      })


    return response; // always false
  }
};

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    你不使用db.Item.findAll的结果,所以你的函数总是返回false。正确的解决方案是awaitdb.Item.findAll调用的结果:

    export default {
      async validateItem(record) {
        const ItemID = +record["ItemID"];
    
        let items = await db.Item.findAll({
          where: { ItemID },
          limit: 1
        });
    
        return (items.length === 1);
      }
    };
    

    另一个问题是,你的代码隐藏了异步调用。您调用了异步函数并从该函数返回了一些结果。但是异步调用的结果或可能引发的错误未处理和未处理。

    您也可以使用db.Item.count 或类似的东西代替db.Item.findAll(我不知道您使用什么ORM),它返回项目计数。

    【讨论】:

    • 谢谢亚历克斯。 items.length 未定义是我得到的。 console.log(items) 表明这是一个承诺,我想它没有长度。
    • @NieSelam 如果db.Item.findAll 返回一个promise,let items = await promise 等待直到promise 将被履行并初始化items 以实现promise 的结果。你确定你正确使用我的代码吗?
    猜你喜欢
    • 2016-11-25
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2017-04-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多