40

node.js から csv をエクスポートしようとしています (mongodb からデータを取得しています)。私はすでにデータを取得してコンマなどで区切っていますが、実際に送信する方法を見つけようとしています...このコードをルートファイルに貼り付けています。データの配列を取得し、リクエストに応じてダウンロードするためにユーザーに直接送信する方法に関するアドバイス。

ここにコードがあります:(コードの下部の2番目の機能を試みました)

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'));
        });
    });     
};
4

12 に答える 12

39

これが私がしたことです:

  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 });
  1. csv データをクライアントに送信する

res.attachment('filename.csv');
res.status(200).send(data);
于 2016-09-23T04:13:32.957 に答える
5

@VierTDの回答に基づいて、json2csvを使用してmongodbデータからcsvデータを構築する必要があります。

依存関係で Package.json を更新します。

  "dependencies": {
    "mongodb": "^2.2.10",
    "json2csv": "*",
    "express": "*"
  }

json2CSV オブジェクトを作成します。これはドキュメント (db テーブル) をマッピングするため、「フィールド」の名前は db テーブルと一致する必要があることに注意してください。fieldNames は自由ですが、これらは 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);

このコードは、mongo db ドキュメント (データベース テーブル) に基づいて csv ファイルをエクスポートする方法を示しています。

アイデアを簡単にサンプリングしたgithubリポジトリを作成し、 Mongo Lab Webサイトにダミーデータを含むデータベースを作成して、このコードがコンピューターですぐに実行されるようにしました.@VietTDの回答に基づいています.

このコードのテストに興味がある場合は、次の行を変更することを忘れないでください。

データベースの URL を変更します (独自のデータベースを使用すると機能しますが、表示のみを目的としています)。

        var url = 'mongodb://admin:detroit123@ds063946.mlab.com: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:detroit123@ds063946.mlab.com: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';
于 2016-12-09T14:29:48.263 に答える
2

質問の内容がよくわかりませんが、Content Disposition ヘッダーを設定することで解決できると思います。別のSOの質問でこの応答を見てください: https://stackoverflow.com/a/7288883/2320243

于 2013-08-19T03:35:10.240 に答える
1

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);
            });
    });
于 2015-02-09T01:05:59.397 に答える