如何用nodejs和hapi@8.8.1上传处理csv文件
How to upload and process csv file with nodejs and hapi@8.8.1
我开始使用现有项目,该项目是使用 Hapi 的旧版本 (hapi@8.8.1) 构建的,服务器上的节点版本也较旧。我的任务是上传包含用户电子邮件地址的 CSV 文件,我需要借助 CSV 文件中提供的电子邮件来处理用户数据。
任务列表如下:-
- 任务 1. 上传 CSV 文件并将其保存在服务器上的目录内
"root/uploaded_csv".
- 任务 2. 读取和处理 CSV 数据以在数据库中搜索用户
借助第 2 列 CSV 中提到的电子邮件。
- 任务 3. 在 AWS s3 服务器上保存导入的 CSV 文件。
由于我正在处理旧节点和 hapi 的版本,在那个阶段我什至无法更新所有版本和依赖项。
第 1 步。接收 CSV 作为 API 参数,如下所示
payload: {
maxBytes: 20715200,
output: 'stream',
parse: true,
allow: 'multipart/form-data'
},
第 2 步。验证导入的 CSV 文件如下:
validate: {
importedCsv: Joi.any()
.meta({swaggerType: 'file'})
.required()
.allow('')
.description('CSV file')
},
步骤 3. 在目录 "root/XXX".
内的服务器上上传和保存 CSV
csvFileName = ""+moment().utc().format('XXXX-XX-XX')+".csv";
csvFilePath = Path.resolve(".") + "/XXX/" + csvFileName ;
var file = fs.createWriteStream(csvFilePath);
file.on('error', function (err) {
console.log(err.message);
});
payload.importedCsv.pipe(file);
payload.importedCsv.on('end', function (err) {
if(err){
cb(ERROR);
}else{
cb(null);
}
});
第 4 步。读取和处理 CSV 数据以在第 2 列的 CSV 中提到的电子邮件的帮助下在数据库中搜索用户。
var obj = csv();
obj.from.path(csvFilePath).to.array(function (data) {
async.forEach(data, function (item, callback){
/** Data processing and query part **/
console.log(item[1]); /* will print email from the second cloumn in the CSV */
}, function(err) {
cb(null);
});
});
步骤 5. 在 AWS s3 服务器上保存导入的 CSV 文件。
fs.readFile(csvFilePath, function (error, fileBuffer) {
var accessKeyId = XXXXXX;
var secretAccessKeyId = XXXXXX;
AWS.config.update({accessKeyId: accessKeyId, secretAccessKey: secretAccessKeyId});
var s3bucket = new AWS.S3();
var params = {
Bucket: XXXXXXX,
Key: 'XXX' + '/' + csvFileName,
Body: fileBuffer,
ACL: 'public-read',
ContentType: payload.importedCsv.hapi.headers['content-type']
};
s3bucket.putObject(params, function (err, data) {
if (err) {
// cb(ERROR);
}else{
// cb(null);
}
});
});
我开始使用现有项目,该项目是使用 Hapi 的旧版本 (hapi@8.8.1) 构建的,服务器上的节点版本也较旧。我的任务是上传包含用户电子邮件地址的 CSV 文件,我需要借助 CSV 文件中提供的电子邮件来处理用户数据。
任务列表如下:-
- 任务 1. 上传 CSV 文件并将其保存在服务器上的目录内 "root/uploaded_csv".
- 任务 2. 读取和处理 CSV 数据以在数据库中搜索用户 借助第 2 列 CSV 中提到的电子邮件。
- 任务 3. 在 AWS s3 服务器上保存导入的 CSV 文件。
由于我正在处理旧节点和 hapi 的版本,在那个阶段我什至无法更新所有版本和依赖项。
第 1 步。接收 CSV 作为 API 参数,如下所示
payload: {
maxBytes: 20715200,
output: 'stream',
parse: true,
allow: 'multipart/form-data'
},
第 2 步。验证导入的 CSV 文件如下:
validate: {
importedCsv: Joi.any()
.meta({swaggerType: 'file'})
.required()
.allow('')
.description('CSV file')
},
步骤 3. 在目录 "root/XXX".
内的服务器上上传和保存 CSVcsvFileName = ""+moment().utc().format('XXXX-XX-XX')+".csv";
csvFilePath = Path.resolve(".") + "/XXX/" + csvFileName ;
var file = fs.createWriteStream(csvFilePath);
file.on('error', function (err) {
console.log(err.message);
});
payload.importedCsv.pipe(file);
payload.importedCsv.on('end', function (err) {
if(err){
cb(ERROR);
}else{
cb(null);
}
});
第 4 步。读取和处理 CSV 数据以在第 2 列的 CSV 中提到的电子邮件的帮助下在数据库中搜索用户。
var obj = csv();
obj.from.path(csvFilePath).to.array(function (data) {
async.forEach(data, function (item, callback){
/** Data processing and query part **/
console.log(item[1]); /* will print email from the second cloumn in the CSV */
}, function(err) {
cb(null);
});
});
步骤 5. 在 AWS s3 服务器上保存导入的 CSV 文件。
fs.readFile(csvFilePath, function (error, fileBuffer) {
var accessKeyId = XXXXXX;
var secretAccessKeyId = XXXXXX;
AWS.config.update({accessKeyId: accessKeyId, secretAccessKey: secretAccessKeyId});
var s3bucket = new AWS.S3();
var params = {
Bucket: XXXXXXX,
Key: 'XXX' + '/' + csvFileName,
Body: fileBuffer,
ACL: 'public-read',
ContentType: payload.importedCsv.hapi.headers['content-type']
};
s3bucket.putObject(params, function (err, data) {
if (err) {
// cb(ERROR);
}else{
// cb(null);
}
});
});