管理后台通常涉及excel下载,由于公司最近重构项目变为三个小项目,数据库也分为了3个,这给管理后台增加了下载压力;在用户列表中,数据库操作涉及联表查询和跨库查询,几千条数据容易造成数据处理过长返回504;于是今天就开始了优化,优化预计分三步走:
一、将excel转为csv下载,因为csv从格式上说就是一组组append的数据,不需要在格式转换上浪费运算量;
二、优化联表查询,可以通过添加索引来优化;
三、由于运算时间太长,所以可以打算使用email发送结果。
- 从excel转为csv下载
const stringify = require('csv-stringify')
const Promise = require('bluebird')
const _ = require('lodash')
const iconv = require('iconv-lite')
class ExcelUtil {
static async genCsv (array, columns, request) {
if (_.isEmpty(array) || _.isEmpty(columns)) throw new AppError('参数错误')
return await new Promise(function (resolve, reject) {
stringify(array, { header: true, columns: columns, delimiter: ',' }, function (err, data) {
if (err) {
return reject(err)
}
const userAgent = request && request.header && request.header['user-agent']
if (userAgent && userAgent.match(/windows/i)) {
data = iconv.encode(data, 'gbk')
}
resolve(data)
})
})
}
}
module.exports = ExcelUtil
其中遇到了一个坑,linux打开显示正常,windows显示乱码,我就猜测是编码的问题,问了同事他说之前也遇到过,windows使用gbk字符集,可以通过request的user-agent判断是否windows系统
- 后续会继续优化