Отправка данных формы с помощью модуля собственного узла - PullRequest
0 голосов
/ 04 октября 2018

для моего текущего проекта я должен отправить данные формы из моей лямбда-функции в конечную точку API.Конечная точка API по существу ожидает два изображения (которые сравниваются друг с другом) и ключ.Как упоминалось ранее, я почему-то не могу отправить правильные данные формы в конечную точку API.Я проверил почтальона, и это, кажется, сработало нормально, но что-то не работает в моей функции.Я предполагаю, что это должно быть связано со строкой данных формы, которую я отправляю.Ниже вы можете найти сокращенную версию функции (я исключил два файла изображения), но каким-то образом я получаю сообщение об ошибке, сообщающее, что API не может прочитать свойство ключа:

const http = require('http');
const https = require('https');
const httpPromise = (protocol, params, postData) => {
    return new Promise((resolve, reject) => {
        const requestModule = protocol === 'http' ? http : https;
        const req = requestModule.request(params, res => {
            // grab request status
            const statusCode = res.statusCode;
            if(statusCode < 200 || statusCode > 299) {
                throw new Error('Request Failed with Status Code:', statusCode);
            }

            let body = '';
            // continuosly update data with incoming data
            res.setEncoding('utf8');
            res.on('data', data => body += data);

            // once all data was received
            res.on('end', () => resolve(body));
        })

        // write data to a post request
        if(typeof(params.method) === 'string' && params.method === 'POST' && postData) {
            req.write(postData)
        }


        // bind to the error event
        req.on('error', err => reject(err));

        // end the request
        req.end();
    })
}

const controller = async () => {
    const apiKey = "00000000";
    const options = {
        hostname: '***"
        port: 80,
        path: '***'
       method: 'POST',
       headers: {"content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"}
    }
    const postData = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\00000000\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
    let result = await httpPromise('http', options, postData)
    console.log(result);
}

да,так что почему-то он просто не распознает ключ в строке postData.Я пробовал разные комбинации, но никак не могу заставить это работать.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Хорошо, так что для тех, кто может столкнуться с той же проблемой, мне потребовалось немного времени, но я понял, в чем проблема.Я не установил заголовок Content-Length, который в свою очередь означал, что узел автоматически добавил заголовок Transfer-Encoding и установил его значение в chunk.Это сломало принимающий API и привело к проблеме.Установка заголовка Content-Length на правильную длину и установка заголовка Transfer-Encoding на пустую строку разрешили мою проблему здесь (но я думаю, что можно было бы просто опустить заголовок Transfer-Encoding после того, как вы определили заголовок Content-Length).

0 голосов
/ 05 октября 2018

Библиотеки http и https по умолчанию довольно многословны и раздражают.

Рекомендует использовать вместо этого request library.Подробнее здесь

В этом случае, чтобы сделать запрос, вы можете просто написать его как:

var request = require('request');

var formData = {
  // Pass a simple key-value pair
  my_field: 'my_value',
}

request.post({url:'http://service.com/upload', formData: formData}, (err, response, body) => {
   // Handle response here
});
...