2017-02-16 20 views
0

CSVファイルをサーバーからクライアントに送信します。 ExpressJSレスポンスでMongoDBから取得しているJSONオブジェクトがあります。NodeJSとExpressJSで入れ子になったJSONオブジェクトの配列をCSVに変換する方法

本文にIDがあり、コレクション名パラメータを持つクライアントからのポストリクエストを受け入れるNodeJSのコードです。レスポンスでは、これらのIDに関連するデータを取得します。

app.post('/api/v1/imagelist_data/raw-data/:db', function(req, res) { 
    console.log("I received a NEW POST raw-data request"); 
    var dbname = req.params.db; 

    var myarray = req.body._id; 

    // Setting Collection Name 
    var mycollection = db.collection(dbname); 

    // Convert the list of ids to mongo object ids 
    var objectIds = myarray.map(function(item) { 
     return mongojs.ObjectId(item); 
    }); 

    console.log(objectIds); 

    mycollection.find({ 
     _id: { 
      $in: objectIds 
     } 
    }, function(err, docs) { 

     res.json(docs); 


    }); 

ここでは、クライアント側で応答のオブジェクトの配列を取得しています。 これらのオブジェクトの配列でCSVファイルを作成したいのですが。

オブジェクトの配列は次のようになります。

[ 
{ 
    "_id": "58405524d70210dc299ca275", 
    "pictureNumber": 1, 
    "scAttitude": [ 
     0, 
     0, 
     0, 
     1 
    ], 
    "scPosition": [ 
     1, 
     0, 
     0 
    ], 
    "integrationTime": 10, 
    "time": "2016-12-01T16:51:57.000Z", 
    "offset": 1, 
    "gain": 2, 
    "ledStatus": false, 
    "imageType": "Image", 
    "cameraType": "Mongo", 
    "testPatternStatus": false, 
    "temperatureCCD": 189, 
    "temperatureLED1": 162, 
    "temperatureLED2": 152, 
    "temperatureVBG": 490, 
    "temperatureGND": 0, 
    "imageValid": true, 
    "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016", 
    "imageSize": 2271320 
}, 
{ 
    "_id": "586bc534b31a89bb45b0083e", 
    "pictureNumber": 2, 
    "scAttitude": [ 
     1, 
     0, 
     0, 
     1 
    ], 
    "scPosition": [ 
     1, 
     0, 
     0 
    ], 
    "integrationTime": 20, 
    "time": "2016-12-02T16:51:57.000Z", 
    "offset": 2, 
    "gain": 0, 
    "ledStatus": false, 
    "imageType": "Image", 
    "cameraType": "MOngo", 
    "testPatternStatus": false, 
    "temperatureCCD": 189, 
    "temperatureLED1": 162, 
    "temperatureLED2": 152, 
    "temperatureVBG": 490, 
    "temperatureGND": 0, 
    "imageValid": true, 
    "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016", 
    "imageSize": 2271320 
}] 

この処理はサーバーサイドまたはクライアントサイドで行う必要がありますか?

ボタンをクリックするだけで、クライアント側のデータを含むCSVファイルをダウンロードします。

どうすればこの問題を解決できますか?

答えて

0

私の提案は、サーバー側でCSVファイルを生成し、それをクライアント上の添付ファイルとして返すことです。この方法は、CSVファイルがすべてのデバイス(ラップトップ/電話/テーブル/ etc)で同じになることを保証します。さらに、異なるクライアントごとにCSVを作成し直すことを避けることができます。あなたはCSVコンバータ/パーサーのサードパーティのライブラリを選択するか、または、それはあまりにも単純であるならば、あなたが独自に作成することができます

mycollection.find({ 
    _id: { 
     $in: objectIds 
    } 
}, function(err, docs) { 
    if (err) { 
     res.status(400); 
     res.send('Unexpected db error'); 
    } 

    var csv = convertCollectionToCsv(docs); 
    if (!csv) { 
     res.status(400); 
     res.send('Invalid csv format'); 
    } 

    res.attachment('filename.csv'); 
    res.status(200).send(csv); 
}); 

:expressjsでcsvファイルで

レスポンス。おかげでたくさん..私はJavaScriptに初心者です

var data = getData(); 
 
var csv = convertCollectionToCsv(data); 
 
console.log(csv); 
 

 
function convertCollectionToCsv(docs, seperator) { 
 
    if (!(Array.isArray(docs) && docs.length > 0)) { 
 
    return; 
 
    } 
 

 
    seperator = seperator || ','; 
 

 
    var header = createHeader(docs); 
 
    var body = docs.map(convertObjectsToCsv); 
 
    var csv = [] 
 
    .concat([header]) 
 
    .concat(body) 
 
    .join('\n'); 
 

 
    return csv; 
 

 
    function createHeader(docs) { 
 
    var headRow = docs[0]; 
 
    var header = Object.keys(headRow); 
 
    return header.join(seperator); 
 
    } 
 

 
    function convertObjectsToCsv (doc) { 
 
    // special treatment for dates, nested arrays or objects 
 
    // for instance: 
 
    doc['scAttitude'] = (doc['scAttitude'] || []).join('-'); 
 
    doc['scPosition'] = (doc['scPosition'] || []).join('-'); 
 

 
    var values = getValuesFromObject(doc); 
 
    return values.join(seperator); 
 
    } 
 
} 
 

 
function getValuesFromObject(obj) { 
 
    if (typeof obj !== 'object' || obj === null) { 
 
    return []; 
 
    } 
 

 
    var keys = Object.keys(obj); 
 
    var values = []; 
 
    for (var i = 0; i < keys.length; ++i) { 
 
    values.push(obj[keys[i]]); 
 
    } 
 

 
    return values; 
 
} 
 

 
function getData() { 
 
    return [{ 
 
     "_id": "58405524d70210dc299ca275", 
 
     "pictureNumber": 1, 
 
     "scAttitude": [ 
 
      0, 
 
      0, 
 
      0, 
 
      1 
 
     ], 
 
     "scPosition": [ 
 
      1, 
 
      0, 
 
      0 
 
     ], 
 
     "integrationTime": 10, 
 
     "time": "2016-12-01T16:51:57.000Z", 
 
     "offset": 1, 
 
     "gain": 2, 
 
     "ledStatus": false, 
 
     "imageType": "Image", 
 
     "cameraType": "Mongo", 
 
     "testPatternStatus": false, 
 
     "temperatureCCD": 189, 
 
     "temperatureLED1": 162, 
 
     "temperatureLED2": 152, 
 
     "temperatureVBG": 490, 
 
     "temperatureGND": 0, 
 
     "imageValid": true, 
 
     "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016", 
 
     "imageSize": 2271320 
 
    }, 
 
    { 
 
     "_id": "586bc534b31a89bb45b0083e", 
 
     "pictureNumber": 2, 
 
     "scAttitude": [ 
 
      1, 
 
      0, 
 
      0, 
 
      1 
 
     ], 
 
     "scPosition": [ 
 
      1, 
 
      0, 
 
      0 
 
     ], 
 
     "integrationTime": 20, 
 
     "time": "2016-12-02T16:51:57.000Z", 
 
     "offset": 2, 
 
     "gain": 0, 
 
     "ledStatus": false, 
 
     "imageType": "Image", 
 
     "cameraType": "MOngo", 
 
     "testPatternStatus": false, 
 
     "temperatureCCD": 189, 
 
     "temperatureLED1": 162, 
 
     "temperatureLED2": 152, 
 
     "temperatureVBG": 490, 
 
     "temperatureGND": 0, 
 
     "imageValid": true, 
 
     "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016", 
 
     "imageSize": 2271320 
 
    }]; 
 
}

+0

: 次は、CSVファイルを作成するために、典型的な方法論です。私のアプリケーションであなたのコードを使用しようとすると、これらの2行は私にエラーを与えています。 doc ['scAttitude'] =(doc ['scAttitude'] || [])。join( ' - '); doc ['scPosition'] =(doc ['scPosition'] || [])。join( ' - '); Object.valuesは関数ではありません at convertObjectsToCsv 助けてもらえますか? –

+0

'Object.values'はブラウザの互換性のため動作しません。https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_objects/Object/values独自のgetValuesFromObject関数を作成することをお勧めします。 'getValuesFromObject'関数を使用した例を更新しました – Apostolidis

+0

まだ動作していません.. JSFiddleをご覧ください。 ここはリンクです:https://jsfiddle.net/1L3Lv4sv/ –

0

あなたはこれらのモジュールのいずれかを使用することができます:それはCSVやTSVだ場合

(心配しないでください - ちょうどあなたが正しい区切り記号を使用していることを確認しましたあなたの場合はコンマです)またはこれらのリストの他のもの:

これは、はるかに簡単で手動で任意の特殊文字を持っている場合は特に、右の出力を構成するよりも少ないエラーが発生しやすくなります。

関連する問題