使用NodeJS进行多部分/混合响应

时间:2015-09-02 13:37:12

标签: javascript json node.js multipartform-data

我遇到以下情况:使用NodeJS返回包含以下项目的多部分/混合响应,我们控制通信的两端,以便我们能够消除互操作性问题。

  1. JSON文件,包含描述每个ZIP的节点列表,即 [{name:test1,desc:Test1 Desc,md5:1234ABCD,file:zip-01.zip},{name:test1,desc:Test1 Desc,md5:1234ABCD,file:zip-02.zip}]
  2. 从mongo gridfs商店
  3. 读取ZIP文件
    --whoop
    Content-Disposition: attachment; name="zip"; filename="tobi.zip"
    Content-Type: application/zip
    
    ... data here ...
    --whoop
    Content-Disposition: form-data; name="name"
    Content-Type: text/plain
    
    Tobi
    --whoop--
    

    我需要将此流回流给用户,以便他们可以处理JSON文件,如果需要,可以展开他们感兴趣的特定ZIP文件。

    从API指南http://expressjs.com/api.html开始,我看不出这是怎么回事?我已正确返回单个ZIP文件,但需要支持此业务方案。

    我试图创建类似于以下内容的内容: HTTP multipart response using Perl or PHP

    res应该包含一个JSON文件和所有相关的ZIP。

    感谢任何帮助。感谢。

    Ĵ

1 个答案:

答案 0 :(得分:1)

解决方案看起来像这样 - 需要将每个项目调用到响应中。

                res.writeHead(200, {
                    'Content-Type': 'multipart/x-mixed-replace; charset=UTF-8; boundary="' + SNAPSHOT_BOUNDARY + '"',
                    Connection: 'keep-alive',
                    Expires: 'Fri, 01 Jan 1990 00:00:00 GMT',
                    'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate',
                    Pragma: 'no-cache'
                });

feed.snapshots.forEach(function (item) {
                writeResponse(item);
            });

    function writeResponse(item) {
        var buffer = new Buffer(0);
            var readStream = getGridFs().createReadStream({root: 'items', _id: snapshotItem._id});

            readStream.on('error', function (err) {
                if (err) {
                    // handle error
                }
            });

            readStream.on('data', function (chunk) {
                buffer = Buffer.concat([buffer, chunk]);
            });

            readStream.on('end', function () {
                res.write('\n\n' + SNAPSHOT_BOUNDARY + '\n');
                res.write('Content-Disposition: filename="' + item.filename + '" \n');
                res.write('Content-Type: application/zip \n');
                res.write('Content-length: ' + buffer.length + '\n\n');
                res.write(buffer);
            });
    }

仍然遇到超级解析多部分响应的问题 - 在https://github.com/felixge/node-formidable/issues/348

打开故障单