Ждите Обещание, чтобы закончить в экспресс-функции - PullRequest
0 голосов
/ 26 октября 2018

У меня есть почтовый вызов в Express, который необходимо проверить, поэтому я создал файл javascript с именем «validator.js», чтобы проверить переданные значения, прежде чем продолжить.Один из методов в "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" };
}

1 Ответ

0 голосов
/ 26 октября 2018

Вы поделились ограниченной информацией.Вам нужно, как вы определили validateMedia, возвращает ли он Promise, используя new Promise, или это функция asyncasync-await await ожидает выполнения обещания.

Подробнее о async-await и обещании можно прочитать здесь .

В зависимости отпредоставленная вами информация должна работать, если функция validateMedia имеет вид:

с Promise:

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-await:

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" };
      }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...