Отправьте запрос, сделав асинхронный вызов c, ожидая, что БД не вернул правильный результат. Node.js - PullRequest
0 голосов
/ 28 марта 2020

Я думаю, что мне нужна помощь с пониманием asyn c ожидают функциональности.

Я делаю запрос Post, который asyn c:

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);
    }
})

Как вы можете сказать сообщение request выполняет вызов асинхронной функции c с именем 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.actedRows всегда <0. Поэтому мой возврат всегда Fail. Я подумал, что при использовании функции await вызов sql будет ждать перед переходом к следующему скомпилированному оператору if. Я, конечно, пытался использовать asyn c в разных формах. Я понимаю, что мне не нужно использовать Обещания, поскольку Обещания происходят "за сценой" в функциональности await / asyn c. Что я могу делать не так? </p>

result.afferedRow не определен, когда я показываю его в журнале консоли вне запроса sql в коде.

1 Ответ

1 голос
/ 28 марта 2020

Если вы передадите обратный вызов, con.query не вернет promise. Вы должны либо передать обратный вызов, либо использовать без обратного вызова в try-catch

Иначе записать логи c в обратном вызове:

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");
      }
    });
  });
}

С Asyn c -Await :

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

...