使用KnexJS查询X个表的数量?

我有一个独特的情况,我有一个优雅的方式解决问题。

用户传递一组他们想要输出数据的信号。 这个数组可以是1 – > Any_Number,所以我首先根据传递的信号来获取表名(每个信号都存储在一个单独的表中),并将它们存储在一个对象中。

下一步是遍历该对象(包含我需要查询的表名),执行每个表的查询并将结果存储在一个对象中,该对象将被传递给Promise中的下一个链。 我还没有看到任何好的方法来处理这个例子,但我知道这是一个相当独特的场景。

在尝试添加对信号数组的支持之前,我的代码简单地如下所示:

exports.getRawDataForExport = function(data) { return new Promise(function(resolve, reject) { var getTableName = function() { return knex('monitored_parameter') .where('device_id', data.device_id) .andWhere('internal_name', data.param) .first() .then(function(row) { if(row) { var resp = {"table" : 'monitored_parameter_data_' + row.id, "param" : row.display_name}; return resp; } }); } var getData = function(runningResult) { return knexHistory(runningResult.table) .select('data_value as value', 'unit', 'created') .then(function(rows) { runningResult.data = rows; return runningResult; }); } var createFile = function(runningResult) { var fields = ['value', 'unit', 'created'], csvFileName = filePathExport + runningResult.param + '_export.csv', zipFileName = filePathExport + runningResult.param + '_export.gz'; var csv = json2csv({data : runningResult.data, fields : fields, doubleQuotes : ''}); fs.writeFileSync(csvFileName, csv); // create streams for gZipping var input = fs.createReadStream(csvFileName); var output = fs.createWriteStream(zipFileName); // gZip input.pipe(gzip).pipe(output); return zipFileName; } getTableName() .then(getData) .then(createFile) .then(function(zipFile) { resolve(zipFile); }); }); } 

显然,这对单个表格工作正常,我已经getTableName()和createFile()方法更新来处理数据数组,所以这个问题只适用于getData()方法。

干杯!

这种问题远不是独特的,而且走向正确的道路是非常简单的。

不要重写三个内部函数中的任何一个。

只需清除.getRawDataForExport()的显式承诺构造反模式 ,以便它返回一个自然发生的承诺并将asynchronous错误传播给调用者。

 return getTableName() .then(getData) .then(createFile); 

现在, .getRawDataForExport()是多个“gets”的基本构build块。

然后,一个deviseselect; 并行与连续操作。 两者都有很好的文件logging。

平行:

 exports.getMultiple = function(arrayOfSignals) { return Promise.all(arrayOfSignals.map(getRawDataForExport)); }; 

顺序:

 exports.getMultiple = function(arrayOfSignals) { return arrayOfSignals.reduce(function(promise, signal) { return promise.then(function() { return getRawDataForExport(signal); }); }, Promise.resolve()); }; 

首先,为了获得最佳的潜在性能,请尝试平行。

如果服务器扼杀,或可能永远窒息并行操作,请select顺序。