Как поставить PDF с chai-http?

Хорошо, это довольно целостный вопрос, так как мне нужно знать как о процессе, так и о лучших практиках. Критика приветствуется!

Я пишу тест для конечной точки PDF-to-image API. Таким образом, мне нужно put PDF в endpoint. Конечная точка сохранит его локально, преобразует, сохранит последовательность изображений в корзине S3, а затем отправит обратно массив URL-адресов. Но, поскольку я пишу этот тест в основном для помощи в разработке, ничего из этого пока не происходит. Я просто хочу убедиться, что смогу получить PDF-файл в конечной точке и сохранить его.

Посмотрите тестовый код ниже:

// testing dependencies
const chai = require("chai")
const chaiHttp = require("chai-http")
const should = chai.should()
const server = require('./../index.js')

chai.use(chaiHttp)

// utility dependencies
const fs = require('fs')

describe("PDF upload", () => {
  it("should PUT my pdf", (done) => {
    fs.readFile('./content/pdf/lockheed.pdf', (err, res) => {
      if (err) { console.error(err) }
      else {
        chai.request(server)
          .put('/v1/convert-pdf')
          .set('Content-Type', 'application/pdf')
          .send({ pdf: res })
          .end((err, res) => {
            console.log("got the res")
            if (err) { console.error(err) }
            else { console.log(res.body) }

            done()
          })
      }
    })
  })
})

Прежде чем я установил заголовок Content-Type, я просто получил 413 от сервера (слишком большой запрос). Я установил все свои тайм-ауты и максимальный размер запроса очень большими, поэтому это действительно не должно быть проблемой. Но теперь, когда у меня есть application/pdf в заголовке, я получаю эту ошибку:

Uncaught TypeError: "string" must be a string, Buffer, or ArrayBuffer

Это было гораздо полезнее и привело меня к этому SO, который направляет файл на запрос. Однако я действительно не уверен, как это сделать через chai-http, чтобы мой сервер мог успешно получить и сохранить PDF-файл в локальный файл.


person Corbfon    schedule 11.03.2017    source источник


Ответы (1)


Чтобы загрузить файл через chai-http, используйте attach вместо send. Вот пример:

describe("PDF upload", () => {
  it("should PUT my pdf", (done) => {
    chai.request(server)
      .put('/v1/convert-pdf')
      .set('Content-Type', 'application/pdf')
      .attach('fileField', './content/pdf/lockheed.pdf', 'lockheed.pdf')
      .end((err, res) => {
        console.log("got the res");
        if (err) {
          console.error(err)
        } else {
          console.log('success');
          console.log(res.body)
        }
        done();
      });
  })
})

На самом деле chai-http использует тот же API, что и SuperAgent. Подробнее см. в документе.

person shaochuancs    schedule 13.03.2017
comment
Ах интересно! Я должен буду попробовать, когда у меня будет шанс. На самом деле я прикрепил его как буфер из fs.readFile, который выполнил свою работу, но я буду рад попробовать более лаконичное решение. - person Corbfon; 14.03.2017
comment
@Corbfon правильно ли ответили на ваш вопрос? Если да, может быть, вы любезно примете этот ответ? - person shaochuancs; 03.05.2017