javascript - Node.js mysql 结果到数组
问题描述
我一直在慢慢学习 node.js,以便我可以更好地整合我们当前的许多操作(mysql)和 Xero 会计之间的东西。
我在 mysql 中有几个表,每个表用于 ["invoices","accounts","items","organisations","receipts","taxRates","users","trackingCategories"] 并且每个表都有一个JSON 列与其所在的表同名。这不是 json 问题。
从 "+wewant1[i]" 发送像 ""select "+ wewant1[i] + " 这样的查询基本上是简单的“从发票中选择发票”并且易于迭代。
我可以将 mysql 结果列出,但需要将每个单独的“列表”作为结果数组。
我最终希望能够将“从发票中选择发票”的结果作为节点中的“发票”数组(发票 [0]、发票 [1] 等)引用。
我已经尝试避免“回调地狱”,但仍然无法让它发挥作用......非常欢迎任何提示!
这是当前代码:
var mysql = require('mysql');
var con = mysql.createConnection({
host: "10.0.1.103",
user: "badayaba",
password: "yadabuba",
database: "xeroetc"
});
(async function() {
let wewant1 = ["invoices", "accounts", "items", "organisations", "receipts", "taxRates", "users", "trackingCategories"];
function getmydata(sql, result, callback) {
var query = con.query(sql);
query.on('result', function(row) {
callback(null, row);
});
};
for (let i = 0; i < wewant1.length; i++) {
var sql = "select " + wewant1[i] + " from " + wewant1[i];
getmydata(sql, wewant1[i], function querydata(err, result) {
console.log(err || result);
return result;
});
};
con.end();
})();
20180910 22:00 GMT-6 感谢史蒂文!我想我明白了:
const XeroClient = require('xero-node').AccountingAPIClient;
const XeroErrors = require('xero-node').XeroError;
var mysql = require('mysql');
const config = {
appType: "private",
consumerKey: "_____",
consumerSecret: "_____",
privateKeyPath: "../../../ssl/_____.pem"
};
var con = mysql.createConnection({
host: "_____",
user: "_____",
password: "_____",
database: "xeroetc"
});
(async function(){
let wewant1 = ["invoices","accounts","items","organisations","receipts","taxRates","users","trackingCategories"];
let xero = new XeroClient(config);
function getmydata(it, callback) {
var sql = "select "+it+" from "+it;
con.query(sql, function (err, result, fields) {
if (err) throw err;
callback(null,result);
});
};
const promises = wewant1.map(it => {
return new Promise((resolve, reject) => {
getmydata(it, function querydata(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
})
});
Promise.all(promises)
.then(results => {
//results is a array of the resolved promises
invoices=results[0];
accounts=results[1];
items=results[2];
organisations=results[3];
receipts=results[4];
taxRates=results[5];
users=results[6];
trackingCategories=results[7];
console.log(invoices);
})
.catch(err => {})
.then(() => {
con.end();
})
})();
解决方案
将您的数组映射到承诺,然后使用Promise.all
. 这也解决了您过早关闭连接的未说明问题。
var mysql = require('mysql');
var con = mysql.createConnection({
host: "10.0.1.103",
user: "badayaba",
password: "yadabuba",
database: "xeroetc"
});
let wewant1 = ["invoices", "accounts", "items", "organisations", "receipts", "taxRates", "users", "trackingCategories"];
function getmydata(sql, result, callback) {
var query = con.query(sql);
query.on('result', function(row) {
callback(null, row);
});
};
const promises = weweant1.map(it => {
return new Promise((resolve, reject) => {
getmydata(sql, it, function querydata(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
})
});
Promise.all(promises)
.then(results => {
//results is a array of the resolved promises
})
.catch(err => {})
.then(() => {
// then after catch is a finally block
con.end();
})
当然你也可以使用async
/await
并摆脱then
嵌套。您还可以承诺getmydata
. 不过,它们都使用相同的原则: 等待一系列承诺。
使用异步/等待
如果getmydata
返回一个promise
or 被声明async
,下面的代码片段会做,假设它在一个async
函数中。干净多了...
const promises = weweant1.map(it => getmydata(sql, it))
try {
const results = await Promise.all(promises)
} catch (e) {
// handle error
} finally {
con.end();
}
推荐阅读
- google-cloud-platform - 如何在 GCP 上使用 Cloud Build 在 CI/CD 脚本中包含 Container Registry 漏洞扫描
- javascript - 向箭头函数添加花括号会提高性能吗?
- r - 基于R中的sliderInput日期范围绘制图表
- c++ - 编译器错误出现在一台特定的机器上
- python - Python Pandas Exception 在函数方法中执行 Pandas 操作时发生“示例”,简单函数有效
- swift - 倒数计时器将不起作用,因为它不接受本地函数
- google-apps-script - 有没有办法在从 Gmail 撰写窗口发送邮件时触发应用脚本功能?
- javascript - 如何使用打字稿对象数组而不是单一类型的元素(如字符串)来实现 ngx-select-dropdown
- c - 为什么这个程序不打印'4'?
- c# - 标签值在我将其分配给对象时发生变化