Первое изменение, которое я хотел бы сделать, это удалить async
. Это просто испортит код с ненужными обещаниями.
Во-вторых, я убрал необходимость отлавливать исключение, проверяя существование файла с помощью fs.existsSync(path)
. Старайтесь не вызывать исключения как можно чаще. Если вы знаете, что что-то может вызвать исключение, проверьте его.
Последнее, и самое важное, я создал поток чтения файла и передал результат в ответ с помощью fs.createReadStream(path).pipe(res)
. Таким образом, клиент получает файл во время его чтения, и ваша память освобождается. Отлично подходит для больших файлов.
Чтение файла может занимать много памяти, поэтому загрузка его в память - плохая практика. Вам просто нужно несколько запросов для перегрузки вашего компьютера.
Подробнее о методе pipe можно прочитать здесь .
В этом примере любой вызов GET для /router/show_file
вернет PDF.
const express = require('express')
const app = express()
const fs = require('fs')
const router = express.Router()
router.get('/show_file', (req, res) => {
const path = './public/images/1.pdf'
if (fs.existsSync(path)) {
res.contentType("application/pdf");
fs.createReadStream(path).pipe(res)
} else {
res.status(500)
console.log('File not found')
res.send('File not found')
}
})
app.use('/router', router) // Here we pass the router to the app with a path
app.listen(9999, () => console.log('Listening to port 9999'))