NodeJs / Express отображать PDF-файл в браузере - PullRequest
0 голосов
/ 04 марта 2020

Я работаю над проектом NodeJs / Express и мне нужно показать его в pdf-файле browesr, который хранится в

/ public / images

Здесь соответствующий код маршрутизатора:

router.post('/show_file', async (req,res)=>{
  try {
     let path = './public/images/1.pdf'
     var data =fs.readFileSync(path);
     res.contentType("application/pdf");
     res.send(data);
   } catch (err) {
     res.status(500)
     console.log(err)
     res.send(err.message)
   }
})

Я не получаю никаких ошибок, но ничего не происходит ie .browser не открывается et c. Заранее спасибо за любые рекомендации.

1 Ответ

3 голосов
/ 04 марта 2020

Первое изменение, которое я хотел бы сделать, это удалить 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'))
...