Ответ 1
Вы пробовали что-то подобное с типом контента как "application/octet-stream"
res.set('Content-Type', 'application/octet-stream');
res.send(<your data>);
или просто
res.send(Buffer.from(<your data>));
Привет, я пытаюсь экспортировать csv из node.js(вытаскивание данных из mongodb). У меня уже есть данные, которые вытаскиваются и разделяются запятыми и всеми, но теперь я пытаюсь выяснить, как на самом деле отправить его... Я придерживаюсь этого кода в файле маршрутов. Любые советы о том, как взять массив данных и отправить его пользователю прямо для загрузки по запросу.
вот код: (я попытался выполнить нижнюю часть кода второй функции)
exports.downloadContacts = function(req, res) {
async.waterfall([
function(callback) {
var source = [];
Friend.find({userId: req.signedCookies.userid}, function(err, friends) {
if(err) {console.log('err with friends for download');
} else {
var userMap = {};
var friendIds = friends.map(function (user) {
userMap[user.friend_id] = user;
return user.friend_id;
});
console.log(friends);
User.find({_id: {$in: friendIds}}, function(err, users) {
if(err) {console.log(err);
} else {
for(var i = 0; i < users.length; i++) {
console.log('users')
//console.log(users[i]);
source.push(users[i].firstNameTrue, users[i].lastNameTrue, users[i].emailTrue, users[i].phone, users[i].emailList, users[i].phoneList)
}
console.log(source);
callback(null, source);
}
});
}
});
}
],
function(err, source) {
var result = [];
res.contentType('csv');
csv()
.from(source)
.on('data', function(data){
result.push(data.join());
})
.on('end', function(){
res.send(result.join('\n'));
});
});
};
Вы пробовали что-то подобное с типом контента как "application/octet-stream"
res.set('Content-Type', 'application/octet-stream');
res.send(<your data>);
или просто
res.send(Buffer.from(<your data>));
Вот что я сделал:
var json2csv = require('json2csv');
var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes'];
var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes'];
var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames });
res.attachment('filename.csv');
res.status(200).send(data);
Привет, ребята, основанные на ответе @VierTD, вы должны использовать json2csv для сборки данных csv из данных mongodb.
Обновить пакет .json с dependecies
"dependencies": {
"mongodb": "^2.2.10",
"json2csv": "*",
"express": "*"
}
Создайте объект json2CSV, помните, что это сопоставление вашего документа (таблица db), поэтому имена в "полях" должны соответствовать таблице db, имена полей соответствуют вам, но также важны, поскольку это имена столбцов файла CSV
var json2csv = require('json2csv');
var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes'];
var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes'];
var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames });
Отправить данные csv клиенту
res.attachment('filename.csv');
res.status(200).send(data);
Этот код показывает, как экспортировать файл csv на основе документа mongo db (таблица базы данных)
Я создал github repo действительно очень короткую выборку идеи, также создал базу данных с фиктивными данными в Веб-сайт Mongo Lab, поэтому этот код будет запущен сразу на вашем компьютере. На вопрос @VietTD ответ!
Если вы заинтересованы в тестировании этого кода, просто не забудьте изменить следующие строки
Измените db url (Пользователь ваш собственный db это работает, но это только для показа целей, D)
var url = 'mongodb://admin:[email protected]:63946/misale_dev';
Изменить целевой документ (или таблицу db)
var collection = db.collection('_dummy');
Изменить столбцы документов (или поля столбца таблицы db)
var fields = ['_id', 'JobID', 'LastApplied'];
Наконец, укажите имена столбцов заголовков CSV, а также имя вашего CSV файла
var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE'];
И последнее, но не менее важное:
res.attachment('yourfilenamehere.csv');
Пожалуйста, не стесняйтесь улучшать код примера, я буду этому благодарен! или просто загрузите его и посмотрите на код, он уже поставляется с базой данных, поэтому его будет легко понять и запустить, в таком случае вам не нужен весь код, возможно, вы видите что-то интересное:
//
// EXPRESS JS SERVER INITI
//
var express = require('express')
var app = express()
//
// MONGO DB INIT
//
var MongoClient = require('mongodb').MongoClient, assert = require('assert');
app.get('/', function (req, res) {
var url = 'mongodb://admin:[email protected]:63946/misale_dev';
//
// This function should be used for migrating a db table to a TBD format
//
var migrateMongoDBTable = function(db, callback) {
// Get the documents collection
console.log("Reading database records");
// Get the documents collection
var collection = db.collection('_dummy');
// Find some documents
//collection.find({'a': 3}).toArray(function(err, docs) {
collection.find({}).toArray(function(err, docs) {
assert.equal(err, null);
//console.log(docs);
//console.log('docs.length ---> ', docs.length);
console.log('Creating CSV...');
//console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=');
var json2csv = require('json2csv');
var fields = ['_id', 'JobID', 'LastApplied'];
var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE'];
var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames });
//console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=');
// EXPORT FILE
res.attachment('yourfilenamehere.csv');
res.status(200).send(data);
callback(docs);
});
};
// Use connect method to connect to the server
MongoClient.connect(url, function(err, db) {
assert.equal(null, err);
console.log("Connected successfully to server");
//
// migrate db table to some format TBD
//
migrateMongoDBTable(db, function() {
db.close();
});
});
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
// Connection URL
//var url = 'mongodb://localhost:27017/myproject';
Спасибо!
Я не совсем уверен, в чем вы сомневаетесь, но я думаю, что то, что вы ищете, можно решить, установив заголовок Content Disposition. Взгляните на этот ответ на другой вопрос SO: fooobar.com/questions/33125/....
Express-csv - отличный модуль для записи содержимого csv для потока с сервера node.js, который будет отправлен как ответ клиенту (и загружен как файл). Очень прост в использовании.
app.get('/', function(req, res) {
res.csv([
["a", "b", "c"]
, ["d", "e", "f"]
]);
});
Документы: https://www.npmjs.com/package/express-csv
Когда вы передаете объект, вам необходимо заранее добавить заголовки (если хотите). Здесь мой мой пример, используя npm mysql
router.route('/api/report')
.get(function(req, res) {
query = connection.query('select * from table where table_id=1;', function(err, rows, fields) {
if (err) {
res.send(err);
}
var headers = {};
for (key in rows[0]) {
headers[key] = key;
}
rows.unshift(headers);
res.csv(rows);
});
});
Я нашел решение на этом http://nikgrozev.com/2017/05/10/mongo-query-to-CSV-download-expressjs/
Ключевое слово
поток вывода в ответ HTTP
Используя библиотеку json2csv, вы можете экспортировать csv из данных mongodb.
const json2csv = require('json2csv').parse;
//For unique file name
const dateTime = new Date().toISOString().slice(-24).replace(/\D/g,
'').slice(0, 14);
const filePath = path.join(__dirname, "../../../", "public", "exports", "csv-"
+ dateTime + ".csv");
let csv;
const student = await req.db.collection('Student').find({}).toArray();
// Logging student
// [{id:1,name:"John",country:"USA"},{id:1,name:"Ronny",country:"Germany"}]
const fields = ['id','name','country'];
try {
csv = json2csv(booking_info, {fields});
} catch (err) {
return res.status(500).json({err});
}
fs.writeFile(filePath, csv, function (err) {
if (err) {
return res.json(err).status(500);
}
else {
setTimeout(function () {
fs.unlink(filePath, function (err) { // delete file after 30 sec
if (err) {
console.error(err);
}
console.log('File has been Deleted');
});
}, 30000);
res.download(filePath);
}
})
Пакет json2csv был обновлен с момента написания ответа с наибольшим количеством голосов, более новая версия имеет немного другой синтаксис:
var { Parser } = require('json2csv')
const fields = [{
label: 'header 1',
value: 'field1_name'
}, {
label: 'header 2',
value: 'field2_name'
}]
const json2csv = new Parser({ fields: fields })
try {
const csv = json2csv.parse(data)
res.attachment('data.csv')
res.status(200).send(csv)
} catch (error) {
console.log('error:', error.message)
res.status(500).send(error.message)
}
res.attachment является функцией, а не атрибутом. Нужно убрать знак равенства, чтобы это работало.