【问题标题】:Wait a Promise to finish in an express function等待 Promise 在 express 函数中完成
【发布时间】:2019-03-31 03:44:57
【问题描述】:

我在 Express 中有一个需要验证的 post call,因此我创建了一个名为“validator.js”的 javascript 文件,以在继续之前检查传递的值。 “validator.js”中的方法之一需要做一个axios调用,但它显然需要时间来填充数据。所以我像这样用 async/await 解决了

router.post("/add_to_favorites", passport.authenticate("local"), async(req, res) => 
    { let validation = await validateMedia(req.body);

if (validation.error) {
    return res.status(400).json(validation.message);
   }

“validateMedia”是调用validator.js的函数。


考虑到以下代码,处理此 axios 异步调用的最佳方法是什么?

快递

router.post("/add_to_favorites", passport.authenticate("local"), (req, res) => 
    { let validation = validateMedia(req.body);
if (validation.error) {
    return res.status(400).json(validation.message);
  }
}

validator.js

const validateMedia = data => {
  if (data.mediaType !== "movie" && data.mediaType !== "serie") {
    return {
      error: true,
      message: "Media type is not valid"
    };
  }

  if (data.mediaType === "movie") {
    axios.get(`/${data.mediaType}/${data.mediaId}`).then(response => {
      if (data.mediaTitle === response.data.title) {
        return { error: false, message: "Success" };
      }
      return { error: true, message: "Failed" };
    });
  }
return { error: false, message: "Checked values" };
}

【问题讨论】:

    标签: javascript express asynchronous promise axios


    【解决方案1】:

    您分享的信息有限。需要你如何定义validateMedia 它是使用new Promise 返回一个Promise 还是一个async 函数?在async-await await 等待promise 得到解决。

    详细了解async-await 和promise here。

    根据您提供的信息,如果validateMedia 函数类似于:

    承诺:

    function validateMedia(data) {
      // Using promise here
      return new Promise ( (resolve, reject) => {
        if (data.mediaType !== "movie" && data.mediaType !== "serie") {
          return resolve({    // Call resolve function to return success
            error: true,
            message: "Media type is not valid"
          });
        }
    
        if (data.mediaType === "movie") {
          // This is the function needs to wait for.
          axios.get(`/${data.mediaType}/${data.mediaId}`).then(response => {
            if (data.mediaTitle === response.data.title) {
              // Call resolve function to return success
              return resolve({ error: false, message: "Success" });
            }
            // Call reject function to return error
            return reject({ error: true, message: "Failed" });
          });
        }
      });
    }
    

    使用异步等待:

    async function validateMedia(data) {
    
      if (data.mediaType !== "movie" && data.mediaType !== "serie") {
          return {
            error: true,
            message: "Media type is not valid"
          };
      }
    
      if (data.mediaType === "movie") {
          try {
              // This is the function needs to wait for. if axios.get() returns a promise
              let response = await axios.get(`/${data.mediaType}/${data.mediaId}`);
    
              if (data.mediaTitle === response.data.title) {
                  return { error: false, message: "Success" };
              }
              return { error: true, message: "Failed" };
          }
          // If axios.get() throws error or rejects promise
          catch (err) {
              return { error: true, message: "Failed" };
          }
      }
    }
    

    【讨论】:

    • 这样我不应该被限制在router.post中的异步函数中包装(req,res)吗?因为我刚刚对其进行了测试,并且仅适用于“async (req, res)”和“await validateMedia(req.body)”。 validateMedia 函数只返回一个带有“错误”和“消息”的对象(我已经编辑了我的问题)。抱歉信息有限,我试图避免复制/粘贴所有代码,但您请求的信息实际上对了解很有用。
    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多