Node使用stream导出CSV

需求

公司需求将8万条数据很快的导出,研究了一下,在老大的帮助下成功实现,记录流程希望能帮到你。

写在前面

如果说你想导出Excel可以看我之前的一篇文章,有关Excel导出的。

环境 Nodejs 作为后台语言

流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface)。 stream 模块提供了基础的 API 。使用这些 API 可以很容易地来构建实现流接口的对象。

1
const {Readable} = require('stream')

声明一个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
async function genCsv(data, res) {
// data [{id: 1, code: aaa, money: 1}, {id: 2, code: bbb, money: 2}]
let csv = new Readable
async function push(){
csv.push(`url\n`)// 这个是表头
for (let i of data) {
const str = `${i.code},${i.money}\n` // \n表示换行
csv.push(str)
}
csv.push(null)// 这个表示结束
}
push()
res.setHeader('Content-Type', 'application/csv');
res.setHeader("Content-Disposition", `attachment; filename=${encodeURIComponent('兑换码下载')}.csv`);
// csv.pipe(process.stdout) 结束但是这里直接返回res
csv.pipe(res)
}

export 一个方法暴露给用户,拿到参数去数据库查询。

1
2
3
4
5
export async function downloadBonusCsv(req, res, rest: WxRest) {
const {recordId} = req.query
const data = await rest.query(`select id, code, money/100 as money from bonus where record_id = ${recordId}`);
return genCsv(data, res)
}

到这里就大功告成了。

参考文档:http://nodejs.cn/api/

坚持原创技术分享,您的支持将鼓励我继续创作!