尝试进行外部api调用,然后将数据插入到mongo db中,然后将结果条目呈现到模板

时间:2019-03-26 05:14:05

标签: javascript express

我对Web开发还很陌生,因此很难正确地解决这条路。我想路由到API,然后将api中的数据插入到我的mongo db中,然后将结果呈现到车把模板。我猜不到兑现承诺的事情。下面的代码:

代码运行api调用,获取数据,甚至插入db,但之后将不渲染模板(我最初使用api响应来渲染它,但是当它渲染到api时我希望附加一个db id。模板)。我确信这与诺言有关。我尝试了没有运气的回调,所以尝试了异步/等待功能,这似乎也不起作用。同样,多个回调仍然存在问题,因此我尝试了其他方法。

代码运行api调用,获取数据,甚至插入db,但之后将不渲染模板(我最初使用api响应来渲染它,但是当它渲染到api时我希望附加一个db id。模板)。我确信这与诺言有关。我尝试了没有运气的回调,所以尝试了异步/等待功能,这似乎也不起作用。同样,多个回调仍然存在问题,因此我尝试了其他方法。

async function getRecipeData(param) {
  let res = await axios.get("https://api.edamam.com/search?q=" + param + "&app_id=0abb0580&app_key=bc931d03c51359082244df2fa414c487");
  var dataArray = res.data.hits
  return (dataArray);
}

async function insertSearchedRecipes(resArray) {
  let response = await
  Recipe.create({
    name: resArray[i].recipe.label,
    image: resArray[i].recipe.image,
    url: resArray[i].recipe.url
  });
  return response;
};


router.get('/getRecipes/:ingredient', function (req, res) {
  res.redirect("/");
  var params = req.params.ingredient;
  console.log(params);

  let recipeFind = getRecipeData(params);

  recipeFind.then(function (result) {
    console.log(result[0]);
    for (i = 0; i < result.length; i++) {
      var recipeFindCreate = insertSearchedRecipes(result);
    };

    recipeFindCreate.then(function (results) {
      console.log("HELLO")
      // console.log(results);
      res.render("recipeResults", {
        data: results
      });
    });
  });
});

1 个答案:

答案 0 :(得分:0)

标准陷阱async / await。从函数定义为async返回的值必须始终通过await / then获得。

通过呼叫recipeFindCreate,您只需等待最后一个,其余的将变为异步。

let _ = [];
for (i = 0; i < result.length; i++) {
   _.push(insertSearchedRecipes(result));
};
let results = await Promise.all(_);

重构代码时,请确保在函数中声明了每个变量。

async function insertSearchedRecipes(resArray) {
  let response = await
  Recipe.create({
    name: resArray.recipe.label, //NOT: `resArray[i]`
    image: resArray.recipe.image,
    url: resArray.recipe.url
  });
  return response;
};
//and:
var recipeFindCreate = insertSearchedRecipes(result[i]); // not `result`

另外,看看散装/浴缸插入物主题-添加一次操作产生的数据系列。

顺便说一句:请不要使用var(全局范围)。更好地使用let / const