簡體   English   中英

使用 Node.js 從 MySQL 返回值

[英]Return value from MySQL with Node.js

如果您曾經嘗試使用 Node.js 從 MySQL 獲取返回值,您應該會看到它很復雜,有很多未定義的結果。

當我們在互聯網上尋找答案時,似乎只有一種方法可以“正確”地使用 MySQL 返回結果,並且具有可讀的代碼:Promises。

但是,即使 Promise 也使用.then()鏈接,最后,它與我們通常與 mysql 和 node 一起使用的回調函數沒有太大變化。

那么,是否有一種優雅的方式來鏈接結果,就像我們在 PHP 中所做的那樣?

是的。


實際上,我們將使用 async/await 語法來輕松解決這個問題。 首先,讓我們編寫一個模型類,它將包含我們所有的 sql 查詢作為類的方法。 這里是:

class DB {
    constructor(db) {
        this.db = db;
    }

    async getUsers() {
        let query = "SELECT * FROM users";
          return this.doQuery(query)
    }

    async getUserById(array) {
      let query = "SELECT * FROM users WHERE id = ?";
      return this.doQueryParams(query, array);
    }


    // CORE METHODS DON'T TOUCH
    async doQuery(queryToDo) {
        let pro = new Promise((resolve,reject) => {
            this.db.query(queryToDo, function (err, result) {
                if (err) throw err;
                resolve(result);
            });
        })
        return pro.then((val) => {
            return val;
        })
    }
    async doQueryParams(queryToDo, array) {
      let pro = new Promise((resolve,reject) => {
        this.db.query(queryToDo, array, function (err, result) {
            if (err) throw err; 
            resolve(result);
        });
      })
      return pro.then((val) => {
        return val;
      })
    }
}
module.exports = DB;

每次我們需要一個新的查詢時,我們都會用我們想要的查詢名稱編寫一個新方法,在里面,一個字符串 var 包含您的 mysql 查詢(提醒:需要參數時使用? )。 然后,只需返回this.doQuery[Params](query)的結果,這將是一個Promise

注意:這里,當查詢中沒有任何參數時使用this.doQuery() 如果您需要參數,請使用this.doQueryParams()它將數組作為參數。

在你的server.js文件中,這是如何使用它的:

let DB = require('./modelclass.js')
connection.connect(function(err) {
    if (err) throw err;
    let DBModel = new DB(connection);

    (async function() {
        let oneUser = await DBModel.getUserById([1]);
        let allUsers = await DBModel.getUsers(); // we chain queries like we would do in PHP

        res.render("index.ejs", {oneUser : oneUser[0], allUsers : allUsers}); // results are array, if we know there is only one row, we can use var[0] to directly send the result
    })();
});

如您所見,我們正在執行 2 個查詢,沒有任何回調函數和.then() ,並且我們有兩個包含查詢結果的對象,我們可以將它們直接發送到我們的視圖。 您可以鏈接任意數量的查詢。

此外,這使您無需在需要時重寫每個查詢,並且方法的名稱應該非常明確以使代碼易於閱讀。 所有查詢都在一個文件中,其他內容在另一個文件中,它更清晰,你知道你的代碼做了什么。

常見問題:

  • 返回結果是<Promise> pending => 您確定在調用方法之前放置了await嗎?
  • 我的查詢寫得很好,但我沒有任何結果=> 記住這會返回數組,如果預期只有一行,您應該使用var[0].property而不是var.property

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM