Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Node.js、Express.js、MySQL2和Promises在一个请求中正确地进行多个MySQL调用_Node.js_Express_Promise_Async Await_Node Mysql2 - Fatal编程技术网

如何使用Node.js、Express.js、MySQL2和Promises在一个请求中正确地进行多个MySQL调用

如何使用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

在Node.js/Express.js应用程序中,当我需要在一个请求中运行多个查询时,查看使用wait和MySQL2的正确/最佳/更好的方法

在我的应用程序的早期,我从数据库配置创建了一个承诺池

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仍然“感觉”不对,但我需要知道前两个查询是否有效,否则我会将用户发送到错误页面


在不丧失太多可读性的情况下,实现上述结果的更好方法是什么?

首先:两个代码段都被打断,因为
变量需要在if
if
外部声明

除此之外,您所做的基本上是好的,但这里的一个大问题是,如果其中一个的
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 )
    });
  });