【问题标题】:Passing multiple query objects with res.render使用 res.render 传递多个查询对象
【发布时间】:2021-03-02 19:08:13
【问题描述】:

我想在我的route.js 中传递多个带有res.render() 的查询对象。我有一个select.js,它包含 SQL 语句并将对象传递给我的 route.js。这工作正常,直到我想用res.render() 传递多个查询对象。 关于如何一次传递多个对象的任何想法?

sn-p 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,reject) => {
    db.query(sql, function (err, data, fields) {
      if (err) reject(err);
      resolve({data});
    });
  })
}

module.exports={
  get_KategorieData,
  get_PriceData
}

【问题讨论】:

  • 这可能有帮助吗? stackoverflow.com/questions/52245174/…
  • 是的,我也找到了这篇文章,但我在不同的路线中单独使用这个查询。如果我的 route.js 中没有可能的解决方案,我可以尝试为这个特定站点实现一个新的自己的组合查询
  • 嗯,是的,如果我是你,也许我会查看 SQL 连接,看看我是否可以编写一个连接类别和 Preise 的 SQL 查询。虽然我不知道你的数据库架构所以不确定你是否可以这样做

标签: javascript node.js express


【解决方案1】:

有两种方法可以解决这个问题。一种是坚持承诺,另一种是使用 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 })
});

【讨论】:

  • 感谢您的解决方案!但现在我与我的 route.js 斗争,该对象是未定义的。你知道如何在我的 route.js 中实现它吗?
  • 您是否从单个查询中获得结果?
  • 现在我得到了两个对象“[object Object] [object Object]”。如何访问里面的值?我试过 rename_a[0] 但这不起作用
  • umm... 这样做... 在 router.js 的第一行添加const util=require('util');。并将函数调用重写为 const res = await db.get_data(); 然后 console.log(util.inspect(res,false,null,true)) 这将让您知道响应中的内容。
  • 我找到了值,但不幸的是它们是未定义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 2021-05-09
  • 2022-08-16
相关资源
最近更新 更多