Асинхронная функция с запросом MySQL не будет возвращать результаты запроса node.js - PullRequest
0 голосов
/ 10 июля 2019

У меня есть функция, которая запрашивает базу данных mysql с помощью запроса select.Это все внутри асинхронной функции.Запрос в обратной строке постоянно говорит мне, что он не может найти переменную "rollStatus".

async function PullRollStatus(){
     return new Promise((resolve,reject)=>{

     var sql = `SELECT * FROM brawlid${brawlID}`
     con.query(sql, (error, rows, fields) => { 

     var rollStatus= []
     for (var i in rows) {
     rollStatus.push(rows[i].Bakuganrolled)
         }

     })
     console.log(rollStatus)
     return rollStatus
     })
 }

     var rolledcheck = await PullRollStatus();
     console.log(rolledcheck)

Я никогда раньше не использовал новый Promise, поскольку асинхронные функции все еще для меня новы.Я пробовал это без строки «вернуть новое обещание» и с этим, оба дают одинаковый результат.Я ссылался на этот асинхронный и ожидаю вызова MySQL в узле js , и у меня все еще есть некоторые проблемы, или это может сбить меня с толку, я не знаю.Любая помощь очень ценится.Заранее спасибо!

1 Ответ

1 голос
/ 10 июля 2019

Мне нужно было бы узнать немного больше о базе данных и значении brawlID, но вы не используете return с обещаниями, вместо этого вы используете разрешение и отклонение, также вы возвращаете обещание, не используете ли вы асинхронный. Вот отредактированный пример. Примечание. Я использую mysql.format для передачи переменной в запрос, это защитит от внедрения кода.

Кроме того, я бы подумал, что вы будете использовать оператор where, если только у вас нет таблицы для каждого brawlID, но было бы разумно, если brawlID является столбцом в таблице. Я изменил функцию, чтобы принимать значение переданного параметра brawID вместо ссылки на глобальную переменную.

const mysql = require("mysql2/promise");

const mysqlconfig = {
  host: "localhost",
  user: "youruser",
  password: "yourpassword"
  database: "yourdb"
  multipleStatements: true
};

const con = mysql.createConnection(msqlconfig);

function to (promise) {
    return promise
        .then(val => [null, val])
        .catch(err => [err]);
}

function PullRollStatus(brawlID){
     return new Promise((resolve,reject)=>{

       let sql = `SELECT * FROM brawlid WHERE brawlID=?`;
       mysql.format(sql,brawlID);
       con.query(sql, (error, rows, fields) => { 
         if (error) {
           reject(error);
         } else {
           let rollStatus = [];
           for (let row of rows) {
             rollStatus.push(row.Bakuganrolled)
           }
           console.log(rollStatus);
           resolve(rollStatus);
         }
       });
     });
 }

let brawlIDtoCheck = 1;

let [err,rolledcheck] = await to(PullRollStatus(brawlIDtoCheck));
if (err) {
  console.log("encountered err",err);
}
console.log(rolledcheck)
...