Как добавить файлы в POST, используя запрос-обещание npm? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь отправить запрос Curl, используя запрос-обещание npm. Завиток, который я хочу отправить, выглядит следующим образом:

`curl \
-H "Content-Type: multipart/form-data" \
-F "original=@./${parent_path}"  \
-F "modified=@./${version_path}" \
-o "${out_path}" \
 ${URI}`

Мой код в узле:

BIMFile.findOne({ _id: responseDB.parent_id })
  .then(parent => {
      parent_path = parsePath(parent.path);
      version_path = parsePath(responseDB.path);
      console.log("PARENT!", parent_path, version_path);
      const URI =
        `${protocol}://${host_img_diff}:${port_img_diff}/diff`
      out_path = version_path + '.tmp.jpg';

      request.post({
        url: URI,
        formData: {
          file: fs.createReadStream(parent_path),
          file: fs.createReadStream(version_path)
        }
      }).then((apiResponse) => {
        console.log('apiUPDATEResponse', apiResponse);
      })

Результат:

Unhandled rejection StatusCodeError: 400 - "<!DOCTYPE HTML PUBLIC 
\"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>400 Bad 
Request</title>\n<h1>Bad Request</h1>\n<p>The browser (or proxy) sent a re
quest that this server could not understand.</p>\n"
at new StatusCodeError (/backend/node_modules/request-promise- 
core/lib/errors.js:32:15)
at Request.plumbing.callback (/backend/node_modules/request-promise- 
core/lib/plumbing.js:104:33)
at Request.RP$callback [as _callback] (/backend/node_modules/request- 
promise-core/lib/plumbing.js:46:31)
at Request.self.callback (/backend/node_modules/request/request.js:185:22)
at emitTwo (events.js:126:13)
at Request.emit (events.js:214:7)
at Request.<anonymous> (/backend/node_modules/request/request.js:1161:10)
at emitOne (events.js:116:13)
at Request.emit (events.js:211:7)
at IncomingMessage.<anonymous> 
(/backend/node_modules/request/request.js:1083:12)
at Object.onceWrapper (events.js:313:30)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1055:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)

Сервер возвращает следующее сообщение:

xxx.xx.x.xx - - [05/Apr/2019 10:00:15] "POST /diff HTTP/1.1" 400 -

Как видите, сервер не смог понять запрос на публикацию. Кто-нибудь знает, как правильно добавлять файлы?

1 Ответ

0 голосов
/ 05 апреля 2019

Используйте отправку файлов, используя formData, как и вы, но одна из проблем, с которыми вы сталкиваетесь, заключается в том, что вы задаете оба файла в одном свойстве, и задается только последний.

console.log({ file: 1, file: 2 });

Поэтому, если file может принимать несколько файлов, вам нужно использовать массив

const formData = {
   file: [
       fs.createReadStream(parent_path),
       fs.createReadStream(version_path)
   ]
}

Если вам нужны дополнительные метаданные, request модуль также предоставляет way :

Передача необязательных метаданных с объектом 'options' со стилем: {value: DATA, options: OPTIONS} Вариант использования: для некоторых типов потоков вы 'Вам нужно будет предоставить информацию, связанную с файлом, вручную.
См. form-data README для получения дополнительной информации о параметрах: https://github.com/form-data/form-data

...