如何导出csv nodejs

Lio*_*789 21 mongoose mongodb node.js

嘿我正在尝试从node.js导出csv(从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'));
        });
    });     
};
Run Code Online (Sandbox Code Playgroud)

Jon*_*iaz 23

您是否尝试过类似"内容类型为"application/octet-stream"的内容

res.set('Content-Type', 'application/octet-stream');
res.send(<your data>);
Run Code Online (Sandbox Code Playgroud)

或者干脆

res.send(Buffer.from(<your data>));
Run Code Online (Sandbox Code Playgroud)

快递send()文档.


Vie*_*ran 23

这是我做的:

  1. 使用json2csv从mongodb数据构建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 });
Run Code Online (Sandbox Code Playgroud)
  1. 将csv数据发送到客户端

res.attachment('filename.csv');
res.status(200).send(data);
Run Code Online (Sandbox Code Playgroud)

  • 你如何在前端使用它? (2认同)

sva*_*all 7

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)
        }
Run Code Online (Sandbox Code Playgroud)

res.attachment 是一个函数而不是一个属性。需要删除等号才能工作。