Форма парсинга с использованием многопартийности работает, если используется Postman, но не в приложении NodeJS с использованием request.js. - PullRequest
0 голосов
/ 12 марта 2019

Я хочу отправить файлы из двух приложений NodeJS: App1 и App2.App1 отправляет файл в App2.Если я использую простой POST и GET, все работает нормально.Проблемы возникают, когда я использую multipart для отправки файла.

С App1 я хочу отправить файл JSON в App2.Итак, я написал API в App2 для прослушивания POST с файлами:

Код, используемый в App2 для получения файлов:

httpServer.post('/file', function (req, res) {
    log.yellow("HTTP file received");
    res.send('Thank you!');
    res.end();
    let form = new multiparty.Form();
    form.parse(req, function(err, fields, files) {
        log.red(err);
        log.yellow(fields);
        log.cyan(files);
    });
});

Итак, в App1 я использую request.js для создания HTTPЗапросы.Прежде чем написать функцию, которая отправляет данные, я тестирую API приложения 2 с помощью Postman следующим образом:

Using Postman

или: https://imgur.com/rDWmY2K

Таким образом, я использовал Postman для генерации кода для request.js, который выглядит так:

Код, используемый в App1 для отправки файла:

function sendFileToCompanyX(path) {
    var fs = require("fs");
    var request = require("request");

    var options = { method: 'POST',
        url: 'http://localhost:8000/file',
        headers:
            {
                'cache-control': 'no-cache',
                'Access-Control-Allow-Headers': 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Accept-Encoding, X-GitHub-OTP, X-Requested-With, User-Agent',
                'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' },
        formData:
            { 'printLogFile':
                    { value: fs.createReadStream("/Users/sahelanthropus/IdeaProjects/ThesisPrototype/ManufacturerApp/logs/data.json"),
                        options:
                            { filename: '/Users/sahelanthropus/IdeaProjects/ThesisPrototype/ManufacturerApp/logs/data.json',
                                contentType: null } } } };

    request(options, function (error, response, body) {
        if (error) throw new Error(error);

        console.log(body);
    });

}

Итак, используя Postman, я могу получитьфайл в App2 и обработать его.Но если я использую App1 для отправки (того же самого) файла, App2 может перехватить POST, но form.parse(..., cb) никогда не вызывает обратный вызов (ни для err , полей и files ).

Я использовал Wireshark для сравнения данных, отправляемых из Postman и App1, они одинаковы в элементе HTTP, но я заметил, что Postman использует IPv6, а мои пакеты приложений используют IPv4.

1 Ответ

0 голосов
/ 13 марта 2019

Я решил переместить res.end(); в правую строку:

enter image description here

Это скоро объяснимо: почтальон по умолчанию использует keep alive параметр для соединения, вместо этого приложение моего узла (возможно, где-то в request.js) использует close . Это приводит к невозможности передачи всего файла в случае POST, отправленного из моего приложения.

Теперь это работает.

enter image description here

Другое возможное решение: не меняйте расположение res.end() и установите опцию Соединение: оставьте в живых в запросе отправителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...