Создайте файл Excel из ответа на запрос с помощью Супертеста и шутки

#node.js #xlsx #multer #supertest

Вопрос:

Я хочу получить доступ к файлу Excel, содержащемуся в response.text нем, чтобы проверить его содержимое в супертесте.

В моем бэкэнде Nodejs есть функция, которая возвращает сгенерированный файл Excel. Если я инициирую генерацию файла из моего клиента React, все работает должным образом; т. Е. После сохранения файла я могу открыть его с помощью Excel, и все выглядит так, как ожидалось.

Где мне нужна помощь, так это написать тест с Шуткой и супертестом. Я попытался сохранить данные, полученные с response.text помощью модуля файловой системы Nodejs, следующим образом:

 
it('File Upload: Export project succeeds', async () => {
 const response = await request(app)
    .get(`/api/project/${project.id}/export`)
    .set('Cookie', global.signin())
    .expect(
      'Content-Type',
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    )
    .expect(200);

  expect(response.text).toBeDefined();

  await saveFile(response.text);
});

const saveFile = (data: any) => {
  return new Promise((resolve, reject) => {
    fs.writeFile('my_excel_file.xlsx', data, function (err) {
      if (err) {
        reject(err);
      }
      const successObject = {
        msg: 'success',
        data: 'successfully stored file',
      };
      resolve(successObject);
    });
  });
};
 

Файл сгенерирован просто отлично, но когда я пытаюсь его открыть, Excel сообщает, что возникла проблема с содержимым, и прерывает работу.

Вот как я отправляю файл в своем бэкэнде:

 fileUploadRouter.get(
  '/api/project/:id/export/',
  requireAuth,
  validateUserRole(UserRoles.BASIC),
  async (req: Request, res: Response) => {

  ...

  await workbook.xlsx.writeFile(file);

  res.setHeader('Content-disposition', 'attachment; filename='   filename);
  res.contentType(
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  );

  res.download(file, filename, (err) => {
    if (err) {
      console.log(err);
      }
  });
}
 

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

Мультер и аналогичные инструменты были написаны для загрузки файлов из нескольких частей/форм-данных. Поскольку содержимое файла находится в теле ответа, эти инструменты не требуются.

My best guess it is some encoding issue but I’m just fishing here.

Any help/advice is much appreciated.