#node.js
Вопрос:
Я уже много раз писал этот вопрос и ни от кого не могу найти ответа, поэтому я постараюсь сделать его как можно более подробным, чтобы узнать, знает ли кто-нибудь, что происходит, так как я был заблокирован более недели из-за этой ошибки.
Я создаю веб — сайт с React и его соответствующим API с помощью NodeJS. В Интернете есть часть, где стажер загружает обучение стажера, а затем стажер может загрузить его. Часть загрузки файла уже реализована, и она работает на 100%, проблема возникает, когда мне приходится загружать эти файлы. Когда я загружаю и открываю их, я получаю следующее сообщение (перевод ошибки: произошла ошибка при загрузке PDF-документа).:
Я действительно не знаю, что я делаю неправильно, поэтому ниже я оставляю вам код контроллера express, который я использую в коде nodejs для этой функции api:
routerTrainer.get("/download-training", verifyJWT, async (req, res) => {
const { training_id } = req.headers;
let training = await Training.findOne({
where: { id: training_id },
});
if (training) {
res.download(`${path}${dirname}${training.file_id}`);
}
});
Несколько комментариев по этому поводу. Прежде всего, я использую res.download (), хотя я также использовал многие другие, такие как res.sendFile (), или я также использовал библиотеку fs для создания файла.pipe(res), и ни один из них не работал для меня. Также добавьте, что я на 100% уверен, что путь к файлу в порядке, я уже проверил его и, наконец, добавлю, что промежуточное программное обеспечение verifyJWT не имеет к этому никакого отношения, это просто верификатор токена веб-токенов Json.
Теперь мы перейдем к части React, здесь, в коде, я также много чего перепробовал, я даже использовал такие библиотеки, как file-saver, и это тоже не сработало для меня (я не знаю, ошибка во внешнем интерфейсе или в бэкэнде) . Вот код функции загрузки React:
const downloadTraining = async (id) => {
const fileReader = new FileReader();
const JWT = new ClassJWT();
const axiosReq = axios.create();
await JWT.checkJWT();
axiosReq
.get(`${serverPath}/download-training`, {
headers: {
training_id: id,
token: JWT.getToken(),
responseType: "blob",
},
})
.then((res) => {
console.log(res);
fileReader.readAsDataURL(new Blob([res.data]));
})
.catch((err) => console.log(err));
fileReader.addEventListener("loadend", () => {
const blobString = fileReader.resu<
const link = document.createElement("a");
link.href = blobString;
link.setAttribute("download", "file.pdf");
document.body.appendChild(link);
link.click();
});
};
Я думаю, что все здесь, пожалуйста, спросите, не пропало ли чего-нибудь, я говорю вам, что начинаю немного отчаиваться, потому что я уже потерял больше недели из-за этой ошибки и нигде не могу найти ответ.
Пожалуйста, если кто-нибудь знает, что может произойти, не стесняйтесь отвечать.
Ответ №1:
Если вы посмотрите документацию, я думаю, что тип ответа-это не заголовок, а отдельный параметр (см. https://github.com/axios/axios#request-config).
Вы можете попробовать использовать тип ответа в качестве arraybuffer ?
...
axiosReq
.get(`${serverPath}/download-training`, {
headers: {
training_id: id,
token: JWT.getToken(),
},
responseType: "arraybuffer",
})
...