[英]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.