[英]NodeJs: Run Mysql queries synchronously
我正在使用 NodeJS 和 mysql2 在我的數據庫中存儲數據。 但有時我需要同步執行數據庫保存,如下例所示:
if(rent.client.id === 0){
//Save client
connection.query('INSERT INTO clients (name, identity, licence, birthDate, address, phoneNumber, email) VALUES (?,?,?,?,?,?,?)',
[/*Array of values*/],
function (err, results) {
if (err) throw err;
//Retrieve client id to use it in the next database save
rent.client.id = results.insertId;
})
}
//Save rent
connection.query('INSERT INTO rents (deliveryDate, returnDate, gasLevel, deliveryPoint, deliveryPrice, unitPrice, state, clientID, carID) VALUES (?,?,?,?,?,?,?,?,?)',
[/*Array of values that contain the last inserted id clients*/],
function (err, results) {
if (err) throw err;
console.log('rent saved', results);
})
那么如何同步執行這兩個數據庫保存。 我不認為以以下方式執行此操作是好的代碼:
connection.query(queryString,
[queryValues],
function (err, results) {
if (err) throw err;
connection.query(queryString,
[queryValues],
function (err, results) {
if (err) throw err;
console.log('rent saved', results);
})
})
那么你提出什么樣的解決方案?
我不認為以以下方式執行此操作是好的代碼
不是,只是因為
if (err) throw err;
部分,這不會做任何有用的事情。 (它肯定不會使您的函數使這些query
調用拋出異常;它不能,您的函數已經返回了。它所做的只是從回調中拋出異常; query
可能會忽略它。)
除此之外,這是使用 NodeJS 風格的回調來做到這一點的正確方法。 進一步來說:
function myFunctionToDoThisWork(callback) {
connection.query(queryString1,
[queryValues1],
function (err, results) {
if (err) {
callback(err);
return;
}
connection.query(queryString2,
[queryValues2],
function (err, results) {
if (err) {
callback(err);
return;
}
console.log('rent saved', results);
});
});
}
您可以通過以下方式使代碼更易於維護:
一種是使用承諾,您可以在任何模糊的最新版本的 Node 上使用它(或通過npm
模塊)。 首先,我們會給自己一個啟用 Promise 的query
版本。 在 Node v8 及更高版本中,您可以這樣做:
const promisify = require("utils").promisify;
// ...
const queryPromise = promisify(connection.query.bind(connection));
或者有promisify
npm
模塊,或者這個基本版本真的很簡單:
function promisify(f) {
return function() {
var t = this;
return new Promise(function(resolve, reject) {
var args = Array.prototype.slice.call(arguments);
args.push(function(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
f.apply(t, args);
});
};
}
然后:
function myFunctionToDoThisWork() {
return queryPromise(queryString1, [queryValues1])
.then(() => {
return queryPromise(queryString2, [queryValues2]);
})
.then(() => {
console.log('rent saved', results);
});
});
}
然后通過以下方式消費它:
myFunctionToDoThisWork().then(/*...*/).catch(/*...*/);
在 Node v8 及更高版本上,您可以使用async
和await
進一步實現:
async function myFunctionToDoThisWork() {
await queryPromise(queryString1, [queryValues1]);
await queryPromise(queryString2, [queryValues2]);
console.log('rent saved', results);
}
如果您從async
函數調用它,您將通過await
使用它。 如果從非async
函數調用它,您可以像上面的 promise 版本一樣使用它(通過then
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.