如何在javascript对象属性中保存MySql查询结果?

mpbci0fu  于 2023-03-22  发布在  Mysql
关注(0)|答案(3)|浏览(106)

我有一个Game类,属性为id、player 1和player 2。我想写一个方法从mySql数据库中获取数据,并相应地设置对象属性。
Object在另一个名为index.js的文件中初始化。
我的问题是,在我调用saveData(data)方法之前,查询没有完成执行。我如何解决这个问题?有没有更好的方法来实现这种行为?
Game.js:

const db = require('../mySqlConnection');

class Game{
   constructor(){
        this.id = null;
        this.player1 = null;
        this.player2 = null;
   }

    saveData(data) {
        this.id = data.id;
        this.player1 = data.player1;
        this.player2 = data.player2;
    }

    fetchGame(id){

        const q = "SELECT * FROM `games` WHERE `id`= `id`"
        
        db.query(q, (err, data)=\>{
            if(err) return conssole.log(err)
        
            this.saveData(data)
        })

    }

}

module.exports = Game

index.js:

const Game = require('./components/game')

var firstGame = new Game()
firstGame.fetchGame(1)
console.log("index.js: " +JSON.stringify(firstGame))

console.log()的输出:index.js: {"id":null,"player1":null,"player2":null}
console.log()的预期输出:index.js: {"id":"1","player1":"name1","player2":"name2"}

**编辑:**我用promises和async/await实现了这个功能,如另一个问题所示:如何在不返回任何数据的情况下操作promise中的对象属性?

lf5gs5x2

lf5gs5x21#

这是一个异步获取的问题。像这样设计你的fetchGame方法:

fetchGame(id, callback){

        const q = "SELECT * FROM `games` WHERE `id`= `id`"
        
        db.query(q, (err, data)=\>{
            if(err) return conssole.log(err)
        
            this.saveData(data)
            callback(data)
        })

    }

像这样调用函数:

const Game = require('./components/game')

var firstGame = new Game()
firstGame.fetchGame(1, ()=>{
   console.log("index.js: " +JSON.stringify(firstGame))
})

使用async await:

async fetchGame(id){
        try{

            const q = "SELECT * FROM `games` WHERE `id`= `id`"
        
            const data = await db.query(q)
        
            this.saveData(data)

        }catch(e){
          console.log(e)
        }
    }

像这样调用函数:

const Game = require('./components/game')

var firstGame = new Game()
await firstGame.fetchGame(1)
console.log("index.js: " +JSON.stringify(firstGame))
mf98qq94

mf98qq942#

在您的查询中

const q = "SELECT * FROM `games` WHERE `id`= `id`"

我不认为id会被传递到函数中的id替换。

const q = `SELECT * FROM games WHERE id = ${id}`;

另外,我建议在这里添加console.log

db.query(q, (err, data)=\>{
  if(err) return conssole.log(err)
  console.log(data);  
  this.saveData(data)
})

这将有助于识别data的结构,如预期的那样,并填充数据。
如果有帮助就告诉我。

7gs2gvoe

7gs2gvoe3#

我对这个问题不是很有经验,但出于不同的原因,我确实对此有一些兴趣。
根据你的问题和我的一点点知识,我相信这可以用JS promise解决。
也许像这样的东西(语法可能是错误的或不完整的,但可能作为隧道中的一盏灯-我想)。

let fetchGame(id) = new Promise((resolve, reject) => {

        const q = "SELECT * FROM `games` WHERE `id`= `id`"
        
        db.query(q, (err, data)=\>{
            if(err) return reject(console.log(err);
        
            resolve(this.saveData(data));
        };

在下面的网站中有很多例子:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://www.w3schools.com/js/js_promise.asp

相关问题