Как прикрепить несколько файлов из одного каталога с супер-тестовым пакетом в Node? - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу прикрепить около 100 файлов в POST-запрос, используя supertest , но я не нашел никакого способа сделать это.

const supertest = require('supertest);

const fs = require('fs');
const { promisify } = require('utils');

const request = supertest('http://localhost:3000');

const readdir = promisify(fs.readdir);

(async () => {
  try {
    const files = await readdir(path.resolve(__dirname, '/path/to');
    request
      .post('/upload')
      .attach('file', files)
      .end((response => {
        console.log(response);
      });
  } catch(err) => {
    console.error(err);
  }
)();

Учитывая следующий фрагмент кодазапрос должен связывать метод присоединения каждый раз, когда в запросе требуется отправить fileN , поэтому я хочу, чтобы рекурсивно прикреплять каждый файл в той же папке, используя fs основной модуль узла

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

supertest расширяет superagent функциональностью тестирования и работает аналогичным образом.request.post('/upload') создает экземпляр запроса и является цепным.Методы экземпляра возвращают сам экземпляр для объединения в цепочку:

const requestInstance = request.post('/upload');

requestInstance === requestInstance.attach('file', ...);

supertest и superagent, тогда можно использовать цепочку результата как обещание для правильного потока управления, когда он используется с async..await:

  try {
    const files = await readdir(path.resolve(__dirname, '/path/to');
    let requestInstance = request.post('/upload');

    for (const file of files) {
      // no need to reassign requestInstance because it's same instance
      // requestInstance = requestInstance.attach('file', file);
      requestInstance.attach('file', file);
    }

    const response = await requestInstance;
  } catch (err) {
    console.error(err);
  }
0 голосов
/ 23 февраля 2019

Возможно, вы просто захотите сделать несколько индивидуальных запросов с помощью supertest и Promise.all.Вы можете использовать globby, чтобы получить список файлов, например.без асинхронности может быть даже более простым, если вам не нужен результат где-то еще.

const files = glob(path.resolve(__dirname, '/path/to'));

const requests = files.map((file) => {
    return request
      .post('/upload')
      .attach('file', file)
      .end((response => {
        console.log(response);
      });
});

Promise.all(requests).then(console.log('done')).catch(console.error);
...