问题描述
我想在我的 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 })
});