首页 > 解决方案 > 发出异步等待数据库调用的请求未返回正确结果。节点.js

问题描述

我想我需要帮助来理解异步等待功能。

我发出一个异步的 Post 请求:

app.post('/updateprofile', upload.none(), async function (req, res) {
    try {
        let retData = await mainController.updateProfile(req.body, mysql, connectionParams);
        console.log(retData);
        res.status(200).send(retData);
    } catch (error) {
        console.log(error);
    }
})

正如您所知道的,发布请求调用了我的主控制器中名为 updateProfile 的异步函数:

updateProfile: async function (formData, mysql, connectionParams) {
    console.log("l");
    con = mysql.createConnection(connectionParams);
    const result = await con.query(sql, function (err, result) {
        if (err) {
            console.log(err);
            throw err;
        }

        return result;
    });
    con.end();
    console.log("k");
    if (result.affectedRows > 0) {
        console.log('ffff');
        return "OK"
    } else {
        console.log("22");
        return "Fail";
    }
}

由于某种原因,result.affectedRows 总是 < 0。所以我的回报总是失败。我认为通过使用 await 功能,sql 调用会在进入下一个编译的 if 语句之前等待。我当然尝试过以不同的形式使用异步。我知道我不需要使用 Promises,因为 Promise 发生在 await/async 功能的“幕后”。我可能做错了什么?

当我在代码中的 sql 查询之外的控制台日志中显示 result.affectedRow 时,它是未定义的。

标签: mysqlnode.jsasynchronousasync-await

解决方案


如果传递回调,则con.query不会返回promise。您可以在 try-catch 中通过回调或不使用回调

否则在回调中编写逻辑:

updateProfile: async function fn(formData, mysql, connectionParams) {
  console.log("l");
  con = mysql.createConnection(connectionParams);
  return new Promise((r, rej) => {
    con.query(sql, function(err, result) {
      if (err) {
        console.log(err);
        rej(err);
      }
      con.end();
      if (result.affectedRows > 0) {
        r("OK");
      } else {
        rej("Fail");
      }
    });
  });
}

使用异步等待:

async function fn(formData, mysql, connectionParams) {
  console.log("l");
  con = mysql.createConnection(connectionParams);
  try {
    const result = con.query(sql);
    if (result.affectedRows > 0) {
      return "OK";
    } else {
      return "FAIL";
    }
  } catch (error) {
    console.log(err);
    return "FAIL";
  } finally {
    con.end();
  }
}

随着文件con.query似乎没有回报的承诺。从callback不会使它成为可能。您可以使用 node js util 使函数成为可承诺的。 https://github.com/mysqljs/mysql

const util = require('util');
const fs = require('fs');

const stat = util.promisify(fs.stat);

async function callStat() {
  const stats = await stat('.');
  console.log(`This directory is owned by ${stats.uid}`);
}

参考:https ://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original


推荐阅读