如何使用Node.js、Express.js、MySQL2和Promises在一个请求中正确地进行多个MySQL调用
在Node.js/Express.js应用程序中,当我需要在一个请求中运行多个查询时,查看使用wait和MySQL2的正确/最佳/更好的方法 在我的应用程序的早期,我从数据库配置创建了一个承诺池如何使用Node.js、Express.js、MySQL2和Promises在一个请求中正确地进行多个MySQL调用,node.js,express,promise,async-await,node-mysql2,Node.js,Express,Promise,Async Await,Node Mysql2,在Node.js/Express.js应用程序中,当我需要在一个请求中运行多个查询时,查看使用wait和MySQL2的正确/最佳/更好的方法 在我的应用程序的早期,我从数据库配置创建了一个承诺池 const promisePool=db.promise(); 然后,在POST请求中,我接受2个值,我需要验证这两个值是否有效,然后获取返回的ID并将它们插入到另一个表中 下面是我的第一次尝试,但我错过了JS的优点。(为了演示,我过度简化了所有调用/SQL) app.post('/addUserTo
const promisePool=db.promise();
然后,在POST请求中,我接受2个值,我需要验证这两个值是否有效,然后获取返回的ID并将它们插入到另一个表中
下面是我的第一次尝试,但我错过了JS的优点。(为了演示,我过度简化了所有调用/SQL)
app.post('/addUserToDepartment',异步(req,res)=>{
//获取POST变量
让我们发电子邮件吧example@example.com';
让departmentname=‘sales’;
设insertParams=[];
//需要检查部门ID是否有效
const[departments]=wait promisePool.query(“选择?作为deptid,[departmentname]);
//需要检查电子邮件地址是否有效
const[user]=wait promisePool.query(“选择?作为用户ID,[email]);
//这通常是INSERT或UPDATE语句
if(departments.length&&user.length){
const[rows]=wait promisePool.query(“选择?作为passedDeptId,作为passedUserid,[departments[0].deptid,用户[0].userid]);
}
res.send(行)
}
这是我的第二次尝试,现在完成了承诺
app.post('/addUserToDepartment',异步(req,res)=>{
//获取POST变量
让我们发电子邮件吧example@example.com';
让departmentname=‘sales’;
设insertParams=[];
//需要检查部门ID是否有效
让[[部门],[用户]]=
等待承诺([
promisePool.query(“选择?作为deptid”,[departmentname]),
promisePool.query(“选择?作为用户ID,[电子邮件])
])
//这通常是INSERT或UPDATE语句
if(departments.length&&user.length){
let[rows]=wait promisePool.query(“选择?作为passedDeptId,作为passedUserid,[departments[0].deptid,用户[0].userid]);
}
res.send(行)
}
最后的IF仍然“感觉”不对,但我需要知道前两个查询是否有效,否则我会将用户发送到错误页面
在不丧失太多可读性的情况下,实现上述结果的更好方法是什么?首先:两个代码段都被打断,因为
行
变量需要在ifif
外部声明
除此之外,您所做的基本上是好的,但这里的一个大问题是,如果其中一个的length
为0,则不返回任何内容
这真的是您想要的行为吗?如果我调用/addUserToDepartment
,并且您的数据库中存在问题,您希望此操作以静默方式失败吗
我认为更好的方法是在出现错误时返回适当的错误。理想情况下,您应该只抛出一个异常(但您使用的是Express,我不确定它们是否支持捕获异常)。以下是我最后使用的方法。我添加了捕获,我还做了最后一个查询,作为Promise.all()链的一部分
感谢您花时间回答。我确实返回了它并添加了捕获,因为Node.js不喜欢没有它们。
app.get('/test2', async (req, res) => {
// Get the POST variables
let email = 'example@example.com';
let departmentname = 'sales';
let insertParams = [];
let rtn = {
status : '',
errors : [],
values : []
}
console.clear();
// Need to check if Department ID is even valid
let arrayOfPromises = [
promisePool.query( "SELECT ? AS did", [departmentname] ),
promisePool.query( "SELECT ? AS uid", [email] )
]
await Promise.all(arrayOfPromises)
.then( ([d,u] ) => {
// Get the values back from the queries
let did = d[0][0].did;
let uid = u[0][0].uid;
let arrayOfValues = [did,uid];
// Check the values
if(did == 'sales'){
rtn.values.push( did );
} else{
rtn.errors.push( `${did} is not a valid department`);
}
if(uid == 'example@example.com'){
rtn.values.push( uid );
} else{
rtn.errors.push( `${did} is not a valid department`);
}
if( rtn.errors.length === 0){
return arrayOfValues;
} else{
return Promise.reject();
}
})
.then( async ( val ) => {
// By this point everything is ok
let [rows] = await promisePool.query( "SELECT ? AS passedDeptId,? AS passedUserid", val );
res.send( rtn )
})
.catch((err) => {
console.error(err)
rtn.status = 'APPLICATION ERROR';
rtn.errors.push( err.message);
res.send( rtn )
});
});