Nodejs 导出json,csv格式
Nodejs 导出json,csv格式
var nation_export_save = function(req, res) { var encode = req.body.encode;(encode为‘utf8’ or ‘GBK’) var sname = req.body.sname; var items = req.body.items; Nation.find({}, function(err, nations) { if (sname == ‘JSON’) { res.attachment(‘nation.txt’); res.send(nations); } else if (sname == ‘CSV’) { var ites = []; var lines = items.split(’,’); for (var i = 0; i < lines.length; i++) { ites.push(lines[i]); }; json2csv({ data: nations, fields: ites }, function(err, csv) { var iconv = new Iconv(‘UTF-8’, encode); content = iconv.convert(csv); res.attachment(‘nation.csv’); res.send(content); })
};
})
}
Node.js 导出 JSON 和 CSV 格式
在处理数据导出时,我们经常会遇到需要将数据以不同的格式(如 JSON 或 CSV)进行导出的需求。本文将展示如何使用 Node.js 来实现这一功能,并提供一些示例代码来帮助你更好地理解。
示例代码
首先,我们需要安装一些必要的依赖库,例如 iconv-lite
用于字符编码转换,以及 json2csv
用于将 JSON 数据转换为 CSV 格式。
npm install json2csv iconv-lite
接下来,我们编写一个简单的 Express 路由处理程序,该程序根据请求参数的不同,导出 JSON 或 CSV 文件。
const express = require('express');
const json2csv = require('json2csv').parse;
const fs = require('fs');
const iconv = require('iconv-lite');
const app = express();
app.post('/export', (req, res) => {
const encode = req.body.encode || 'utf8'; // 默认编码为 utf8
const sname = req.body.sname;
const items = req.body.items;
// 假设 Nation 是一个 Mongoose 模型
Nation.find({}, (err, nations) => {
if (err) {
return res.status(500).send({ error: 'Database query failed' });
}
if (sname === 'JSON') {
res.attachment('nation.json');
res.send(JSON.stringify(nations, null, 2));
} else if (sname === 'CSV') {
let fields = items.split(',').map(item => item.trim());
const csv = json2csv(nations, { fields });
// 转换编码
const content = iconv.encode(csv, encode);
res.attachment('nation.csv');
res.send(content);
}
});
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
代码解释
-
依赖库安装:
json2csv
用于将 JSON 数据转换为 CSV 格式。iconv-lite
用于字符编码转换。
-
路由处理:
- 使用
app.post('/export', ...)
定义一个 POST 请求的路由。 - 从请求体中读取
encode
、sname
和items
参数。 - 查询数据库中的所有国家数据。
- 根据
sname
的值判断是要导出 JSON 还是 CSV。
- 使用
-
JSON 导出:
- 如果
sname
是JSON
,则直接将 JSON 格式的字符串发送给客户端。 - 设置响应头,使浏览器下载文件而不是直接显示内容。
- 如果
-
CSV 导出:
- 将
items
字符串拆分成数组,并去除空格。 - 使用
json2csv
将 JSON 数据转换为 CSV 格式。 - 使用
iconv-lite
对 CSV 内容进行编码转换。 - 设置响应头并发送转换后的 CSV 内容。
- 将
通过上述代码,你可以轻松地实现将数据以 JSON 或 CSV 格式导出的功能。希望这对你的项目有所帮助!
为了实现 Node.js 中导出 JSON 和 CSV 文件的功能,可以使用一些流行的库来简化这个过程。以下是一个具体的示例代码,展示了如何根据 req.body.sname
的值将数据导出为 JSON 或 CSV 格式,并处理编码问题。
示例代码
首先,确保安装所需的依赖项:
npm install mongoose json2csv iconv-lite
然后,更新你的代码如下:
const mongoose = require('mongoose');
const json2csv = require('json2csv').parse;
const fs = require('fs');
const iconvLite = require('iconv-lite');
// 假设 Nation 是一个 Mongoose 模型
const Nation = mongoose.model('Nation', new mongoose.Schema({}));
var nation_export_save = async function(req, res) {
const encode = req.body.encode || 'utf8'; // 默认为 utf8
const sname = req.body.sname || 'JSON';
const items = req.body.items;
try {
const nations = await Nation.find({});
if (sname === 'JSON') {
res.attachment('nation.json');
res.send(JSON.stringify(nations));
} else if (sname === 'CSV') {
let fields = items ? items.split(',').map(item => item.trim()) : Object.keys(nations[0]._doc);
const csv = json2csv(nations, { fields });
const content = iconvLite.encode(csv, encode);
res.attachment('nation.csv');
res.send(content);
}
} catch (err) {
console.error(err);
res.status(500).send('An error occurred while exporting the data.');
}
};
解释
-
导入必要的模块:我们使用了
mongoose
来处理数据库查询,json2csv
来生成 CSV 文件,以及iconv-lite
来处理不同编码。 -
定义异步函数:由于数据库查询是异步的,我们将
nation_export_save
函数定义为异步函数。 -
获取请求参数:从
req.body
获取encode
、sname
和items
参数。 -
查询数据库:使用
Nation.find({})
查询所有国家的数据。 -
处理 JSON 输出:如果
sname
为"JSON"
,则直接发送 JSON 格式的字符串。 -
处理 CSV 输出:如果
sname
为"CSV"
,则使用json2csv
库将数据转换为 CSV 格式。我们还处理了items
参数以指定要导出的字段,并且使用iconv-lite
处理编码转换。 -
错误处理:使用
try-catch
结构来捕获并处理可能发生的错误。
这样,你可以根据前端传来的参数灵活地输出 JSON 或 CSV 文件,并支持不同的字符编码。