Отправка RAW-тела с помощью клиента restify

Я пытаюсь опубликовать необработанное тело с помощью restify. У меня правильная сторона приема, при использовании POSTman я могу отправить необработанный zip-файл, и файл правильно создается в файловой системе сервера. Тем не менее, я изо всех сил пытаюсь написать свой тест в мокко. Вот код, который у меня есть, любая помощь будет принята с благодарностью.

Я пробовал этот подход.

const should = require('should');
const restify = require('restify');
const fs = require('fs');

const port = 8080;
const url = 'http://localhost:' + port;

const client = restify.createJsonClient({
    url: url,
    version: '~1.0'
});



const testPath = 'test/assets/test.zip';
fs.existsSync(testPath).should.equal(true);


const readStream = fs.createReadStream(testPath);

client.post('/v1/deploy', readStream, function(err, req, res, data) {
        if (err) {
            throw new Error(err);
        }

        should(res).not.null();
        should(res.statusCode).not.null();
        should(res.statusCode).not.undefined();
        res.statusCode.should.equal(200);


        should(data).not.null();
        should(data.endpoint).not.undefined();
        data.endpoint.should.equal('http://endpointyouhit:8080');


        done();

});

Однако размер файла в файловой системе всегда равен 0. Я неправильно использую свой readStream, но не знаю, как это исправить. Любая помощь будет принята с благодарностью.

Обратите внимание, что я хочу передавать файл в потоковом режиме, а не загружать его в память при передаче и приеме, файл потенциально может быть слишком большим для операции в памяти.

Спасибо, Тодд


person tnine    schedule 05.02.2016    source источник


Ответы (2)


Во-первых, вам нужно будет указать тип содержимого multi-part/form-data. Однако похоже, что restify не поддерживает этот тип контента, поэтому вы вам, вероятно, не повезло с использованием клиента restify для публикации файла.

person HeadCode    schedule 06.02.2016
comment
На самом деле я не хочу использовать multi-part/form-data. Я не публикую форму, я создаю API в стиле S3, где тело полезной нагрузки представляет собой двоичный контент RAW. - person tnine; 08.02.2016

Чтобы ответить на мой собственный вопрос, кажется, что это невозможно сделать с клиентом restify. Я также попробовал модуль запроса, который утверждает, что имеет эту возможность. Однако при использовании их примеров потоковой передачи у меня всегда был размер файла 0 на сервере. Ниже приведен функциональный тест интеграции мокко.

 const testPath = 'test/assets/test.zip';
        fs.existsSync(testPath).should.equal(true);


        const readStream = fs.createReadStream(testPath);


        var options = {
            host: 'localhost'
            , port: port
            , path: '/v1/deploy/testvalue'
            , method: 'PUT'
        };

        var req = http.request(options, function (res) {
            //this feels a bit backwards, but these are evaluated AFTER the read stream has closed

            var buffer = '';

            //pipe body to a buffer
            res.on('data', function(data){
                buffer+= data;
            });

            res.on('end', function () {

                should(res).not.null();
                should(res.statusCode).not.null();
                should(res.statusCode).not.undefined();
                res.statusCode.should.equal(200);


                const json = JSON.parse(buffer);

                should(json).not.null();
                should(json.endpoint).not.undefined();
                json.endpoint.should.equal('http://endpointyouhit:8080');


                done();
            });

        });

        req.on('error', function (err) {
            if (err) {
                throw new Error(err);
            }

        });

        //pipe the readstream into the request
        readStream.pipe(req);


        /**
         * Close the request on the close of the read stream
         */
        readStream.on('close', function () {
            req.end();
            console.log('I finished.');
        });

        //note that if we end up with larger files, we may want to support the continue, much as S3 does
        //https://nodejs.org/api/http.html#http_event_continue
person tnine    schedule 08.02.2016
comment
Этот пост может быть полезен: stackoverflow.com/questions/6158933/ Вы также можете попробовать модуль запроса. - person HeadCode; 09.02.2016