Node.js接口中等待mysql语句执行完毕

初始代码如下:


  sqlQuery.queryInfo( "ev_users", ["username"], { username: "'" + user.username + "'", });

async function queryInfo(tableName, content, condition) {

  // 判断查询内容
  let contentStr = "*";
  if (content && content != []) {
    contentStr = content.join(",");
  }

  let conditionArr = [];
  if (condition && condition != {}) {
    for (let key in condition) {
      if (condition[key]) {
        conditionArr.push(key + "=" + condition[key]);
      }
    }
  }

  //sql查询语句
  let sqlStr = "select " + contentStr + " from " + tableName + " where " + conditionArr.join(" and ");

  // 定义变量接受查询结果
  let errInfo = null
  let resultInfo = null
  await db.query(sqlStr, (err, results) => {
    errInfo = err
    resultInfo = results
  });

  // 返回查询结果
  return {err: errInfo, results: resultInfo}
}

一开始只使用了 async 和 await,发现不起效果,查询返回的结果是

[ Promise { <pending> } ]

解决方法1: 使用 callback 回调函数


  sqlQuery.queryInfo( "ev_users", ["username"],
    {
      username: "'" + user.username + "'",
    },
    function (err, data) {
      // 回调函数
      if (err) {
        return res.send({
          status: "",
          success: false,
          msg: "查询失败",
        });
      }
      if (data && data.length > 0) {
        return res.send({
          status: "",
          success: false,
          msg: "用户名已存在,请重新输入",
        });
      }
    }
  );

function queryInfo(tableName, content, condition, callback) {
  // 判断查询内容
  let contentStr = "*";
  if (content && content != []) {
    contentStr = content.join(",");
  }
  let conditionArr = [];
  if (condition && condition != {}) {
    for (let key in condition) {
      if (condition[key]) {
        conditionArr.push(key + "=" + condition[key]);
      }
    }
  }
  let sqlStr = "select " + contentStr + " from " + tableName + " where " + conditionArr.join(" and ");
  db.query(sqlStr, (err, results) => {
    callback(err, results);
  });
}

将查询结果传递给回调函数,最终可以返回正确的查询结果

解决方法2:使用 Promise 和 (async  + await)

// 处理登录请求
async function login(req, res) {
  let user = req.body;
  let queryRes = await sqlQuery.queryPromise("ev_users", null, {
    username: "'" + user.username + "'",
  });
}

/**
 *
 * 使用 promise 和 (async + await) 等待sql语句执行完毕
 *
 *
 */
// 查询语句
async function queryPromise(tableName, content, condition, callback) {
  // 判断查询内容
  let contentStr = "*";
  if (content && content != []) {
    contentStr = content.join(",");
  }
  let conditionArr = [];
  if (condition && condition != {}) {
    for (let key in condition) {
      if (condition[key]) {
        conditionArr.push(key + "=" + condition[key]);
      }
    }
  }
  let sqlStr = "select " + contentStr + " from " + tableName + " where " + conditionArr.join(" and ");

  // 使用promise
  let res = await new Promise((resolve, reject) => {
    db.query(sqlStr, (err, results) => {
      resolve({
        err: err,
        results: results,
      });
    });
  });
  return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值