#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.