如何使用NodeJS处理这些MySQL情况

时间:2017-03-23 14:27:28

标签: mysql node.js asynchronous

我目前正在开发一个带有MySQL数据库的NodeJS应用程序。

在创建一些网站时,我习惯使用PHP / MySQL,我想知道这是不是在阻碍我开发NodeJS应用程序。

通常情况下,使用PHP / MySQL我有这样的情况:我想要检索我漂亮的烹饪网站的所有食谱,存储在表格食谱中,对于每个食谱,我想要检索存储在表成员

中的作者信息

使用PHP / MySQL,一种可行的方法是使用MySQL JOIN,但我也喜欢这样做:

    /* Let's retrieve all recipes */
    $recipes = $this->recipe_model->all();

    /* 
       For each recipe, let's get the author information 
       using the author id stored in the recipe 
    */
    foreach ($recipes as $key => $recipe) {
      $recipes[$key]["author"] = $this->author_model->get($recipe["author"]);
    }

实际上,我想在我的NodeJS中重现这一点,但由于异步系统,它很复杂。 我尝试使用 async ,但我想确定它是解决我问题的唯一方法。

也许我对NodeJS中的某些东西也有错(我对这项技术没有很多经验)。

有任何建议吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您的数据库查询函数返回promises,您可以执行以下操作:

const recipesPromise = db.from('recipes').all();

const authorsPromise = recipesPromise.then((recipes) => {
  return Promise.all(recipes.map(getRecipeAuthor));
});

authorsPromise.then((authors) => {
  // do something with the authors array here
});

function getRecipeAuthor(recipe) {
  return db.from('authors').where('id', recipe.authorId).first();
}

使用async functions,它更简单:

function getRecipeAuthor(recipe) {
  return db.from('authors').where('id', recipe.authorId).first();
}

async function getRecipiesAndAuthors() {
  const recipes = await db.from('recipes').all();
  const authors = await Promise.all(recipes.map(getRecipeAuthor));

  return {recipes, authors};
}

getRecipiesAndAuthors()
  .then((result) => {
    const recipes = result.recipes;
    const authors = result.authors;
    /* Do something with recipes/authors */
  })
  .catch((error) => {
    /* Handle errors */
  });