使用 res.render

问题描述

我想在我的 res.render() 中使用 route.js 传递多个查询对象。我有一个 select.js,它包含 sql 语句并将对象传送到我的 route.js。这很好用,直到我想用 res.render() 传递多个查询对象。 关于如何一次传递多个对象的任何想法?

snippet route.js(我也需要在这里传递 get_PriceData)

我已经查询了 get_KategorieData 但我不知道如何在一个路由中处理多个查询

router.get('/edit',(req,res,next) => {
  var speisenEintragenData = {};
  db.get_KategorieData()
    .then(({ data: kategorie_data }) => {
      res.render('speiseEintragen',{ kategorie_data }); //maybe putting res.render() after the db.get?
    })
    .catch((error) => {
      console.log(error);
    });
});

select.js


const db = require('./config');

//KATEGORIEN LADEN
const get_KategorieData=()=>{
  var sql = 'SELECT * FROM Kategorie';
  return new Promise((resolve,reject) => {
    db.query(sql,function (err,data,fields) {
      if (err) reject(err);
      resolve({data});
    });
  })
}

//PREISE LADEN

const get_PriceData=()=>{
  var sql = 'SELECT * FROM preise';
  return new Promise((resolve,fields) {
      if (err) reject(err);
      resolve({data});
    });
  })
}

module.exports={
  get_KategorieData,get_PriceData
}

解决方法

有两种方法可以解决这个问题。一种是坚持承诺,另一种是使用 async/await。 使用承诺 创建一个新函数来查询数据库。这是如果您使用的模块不支持 async/await 并且需要回调。

const query = ( sql ) => {
  return new Promise(( resolve,reject) => {
    db.query(sql,function (err,data,fields) {
      if (err) reject(err);
      resolve(data);
    });
  })
}
// and then you can write an async/await function to call n queries like
const get_data = async () => {
  const sql1 = '...';
  const a = await query( sql1 );
  const sql2 = '...';
  const b = await query( sql2 );
  ....
  ....
  ....
  const sqln = '...';
  const n = await query( sqln );
  return { a,b,...,n};
}

或者使用 async/await 你可以直接调用 db.query 并使用响应

 const get_data = async () => {
    const sql1 = '...';
    const res_1 = await db.query(sql1);
    const sql2 = '...';
    const res_2 = await db.query(sql2);
    return { a: res_1,b: res_2 };
  }

router.js 可以重写为

router.get('/edit',async (req,res,next) => {
  const {a:rename_a,b:rename_b and so on}=await db.get_data();
  res.render('view',{ rename_a,rename_b and so on })
});