Skip to content

Commit a254480

Browse files
committed
Nodejs/Express CSV Upload Download to MySQL/PostgreSQL – Multer, Fast-CSV, Json2Csv, Sequelize
0 parents  commit a254480

File tree

11 files changed

+1342
-0
lines changed

11 files changed

+1342
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const env = require('./env.js');
2+
3+
const Sequelize = require('sequelize');
4+
const sequelize = new Sequelize(env.database, env.username, env.password, {
5+
host: env.host,
6+
dialect: env.dialect,
7+
operatorsAliases: false,
8+
9+
pool: {
10+
max: env.max,
11+
min: env.pool.min,
12+
acquire: env.pool.acquire,
13+
idle: env.pool.idle
14+
}
15+
});
16+
17+
const db = {};
18+
19+
db.Sequelize = Sequelize;
20+
db.sequelize = sequelize;
21+
22+
db.Customer = require('../models/customer.model.js')(sequelize, Sequelize);
23+
24+
module.exports = db;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const env = {
2+
database: 'loizenaidb',
3+
username: 'root',
4+
password: '12345',
5+
host: 'localhost',
6+
dialect: 'mysql',
7+
pool: {
8+
max: 5,
9+
min: 0,
10+
acquire: 30000,
11+
idle: 10000
12+
}
13+
};
14+
15+
module.exports = env;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const multer = require('multer');
2+
3+
const storage = multer.diskStorage({
4+
destination: (req, file, cb) => {
5+
cb(null, __basedir + '/uploads/')
6+
},
7+
filename: (req, file, cb) => {
8+
cb(null, file.fieldname + "-" + Date.now() + "-" + file.originalname)
9+
}
10+
});
11+
12+
const upload = multer({storage: storage});
13+
14+
module.exports = upload;
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
const stream = require('stream');
2+
const await = require('await')
3+
const fs = require('fs');
4+
const path = require('path');
5+
6+
const db = require('../config/db.config.js');
7+
const Customer = db.Customer;
8+
9+
const csv = require('fast-csv');
10+
const Json2csvParser = require('json2csv').Parser;
11+
12+
/**
13+
* Upload Single CSV file/ and Import data to MySQL/PostgreSQL database
14+
* @param {*} req
15+
* @param {*} res
16+
*/
17+
exports.uploadFile = (req, res) => {
18+
try{
19+
const customers = [];
20+
fs.createReadStream(__basedir + "/uploads/" + req.file.filename)
21+
.pipe(csv.parse({ headers: true }))
22+
.on('error', error => {
23+
console.error(error);
24+
throw error.message;
25+
})
26+
.on('data', row => {
27+
customers.push(row);
28+
console.log(row);
29+
})
30+
.on('end', () => {
31+
// Save customers to MySQL/PostgreSQL database
32+
Customer.bulkCreate(customers).then(() => {
33+
const result = {
34+
status: "ok",
35+
filename: req.file.originalname,
36+
message: "Upload Successfully!",
37+
}
38+
39+
res.json(result);
40+
});
41+
});
42+
}catch(error){
43+
const result = {
44+
status: "fail",
45+
filename: req.file.originalname,
46+
message: "Upload Error! message = " + error.message
47+
}
48+
res.json(result);
49+
}
50+
}
51+
52+
/**
53+
* Upload multiple Excel Files
54+
*
55+
* @param {*} req
56+
* @param {*} res
57+
*/
58+
exports.uploadMultipleFiles = async (req, res) => {
59+
const messages = [];
60+
61+
for (const file of req.files) {
62+
try{
63+
// Parsing CSV Files to data array objects
64+
const csvParserStream = fs.createReadStream(__basedir + "/uploads/" + file.filename)
65+
.pipe(csv.parse({ headers: true }));
66+
67+
var end = new Promise(function(resolve, reject) {
68+
let customers = [];
69+
70+
csvParserStream.on('data', object => {
71+
customers.push(object);
72+
console.log(object);
73+
});
74+
csvParserStream.on('end', () => {
75+
resolve(customers);
76+
});
77+
csvParserStream.on('error', error => {
78+
console.error(error);
79+
reject
80+
}); // or something like that. might need to close `hash`
81+
});
82+
83+
await (async function() {
84+
let customers = await end;
85+
86+
// save customers to MySQL/PostgreSQL database
87+
await Customer.bulkCreate(customers).then(() => {
88+
const result = {
89+
status: "ok",
90+
filename: file.originalname,
91+
message: "Upload Successfully!",
92+
}
93+
94+
messages.push(result);
95+
});
96+
}());
97+
}catch(error){
98+
console.log(error);
99+
100+
const result = {
101+
status: "fail",
102+
filename: file.originalname,
103+
message: "Error -> " + error.message
104+
}
105+
messages.push(result);
106+
}
107+
}
108+
109+
return res.json(messages);
110+
}
111+
112+
113+
exports.downloadFile = (req, res) => {
114+
Customer.findAll({attributes: ['id', 'name', 'address', 'age']}).then(objects => {
115+
const jsonCustomers = JSON.parse(JSON.stringify(objects));
116+
const csvFields = ['Id', 'Name', 'Address', 'Age'];
117+
const json2csvParser = new Json2csvParser({ csvFields });
118+
const csvData = json2csvParser.parse(jsonCustomers);
119+
120+
res.setHeader('Content-disposition', 'attachment; filename=customers.csv');
121+
res.set('Content-Type', 'text/csv');
122+
res.status(200).end(csvData);
123+
});
124+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module.exports = (sequelize, Sequelize) => {
2+
const Customer = sequelize.define('customer', {
3+
id: {
4+
type: Sequelize.INTEGER,
5+
autoIncrement: true,
6+
primaryKey: true
7+
},
8+
name: {
9+
type: Sequelize.STRING
10+
},
11+
address: {
12+
type: Sequelize.STRING
13+
},
14+
age: {
15+
type: Sequelize.INTEGER
16+
}
17+
});
18+
19+
return Customer;
20+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
let express = require('express');
2+
let router = express.Router();
3+
let upload = require('../config/multer.config.js');
4+
5+
const csvWorker = require('../controllers/csv.controller.js');
6+
7+
let path = __basedir + '/views/';
8+
9+
router.get('/', (req,res) => {
10+
console.log("__basedir" + __basedir);
11+
res.sendFile(path + "index.html");
12+
});
13+
14+
router.post('/api/file/upload', upload.single("file"), csvWorker.uploadFile);
15+
router.post('/api/file/multiple/upload', upload.array('files', 4), csvWorker.uploadMultipleFiles);
16+
17+
router.get('/api/file', csvWorker.downloadFile);
18+
19+
module.exports = router;

0 commit comments

Comments
 (0)