2015-09-02 6 views
0

У меня есть следующий сценарий: для возврата многочастного/смешанного ответа, который будет содержать следующие элементы, используя NodeJS, где мы контролируем оба конца связи, чтобы мы могли устранить проблемы совместимости.multipart/mixed response using NodeJS

  1. JSON-файл, содержащий список узлов, описывающих каждый ZIP IE [{имя: test1, по убыванию: Тест1 Описание изделия, md5: 1234ABCD, файл: zip-01.zip}, {имя: test1, по убыванию: Тест1 Описание изделия, md5: 1234ABCD, файл: zip-02.zip}]
  2. ZIP файлы считываются из Монго gridfs магазина
--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

УЭ должен содержать файл JSON и все связанные с ZIP-х.

Любая помощь приветствуется. Благодарю.

J

ответ

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

По-прежнему возникают проблемы с Supertest разборе многокомпонентные ответов - билет, открытый на https://github.com/felixge/node-formidable/issues/348

Смежные вопросы