Роутинг и файлы в Express

Пусть у нас есть папка pages, а в ней три файла: 1.html, 2.html, 3.html. Давайте сделаем маршруты, отдающие по запросу соответствующие файлы в браузер:

app.get('/page/1/', function(req, res) { res.sendFile(__dirname + '/pages/1.html'); }); app.get('/page/2/', function(req, res) { res.sendFile(__dirname + '/pages/2.html'); }); app.get('/page/3/', function(req, res) { res.sendFile(__dirname + '/pages/3.html'); });

Сольем три маршрута в один, воспользовавшись параметром:

app.get('/page/:num/', function(req, res) { res.sendFile(__dirname + '/pages/' + req.params.num + '.html'); });

Пусть у вас есть несколько папок, а в этих папках хранятся файлы. Сделайте маршрут, отдающий заданный файл из заданной папки.

Ошибка 404

Давайте теперь сделаем так, чтобы при запросе несуществующего файла отдавалась 404 ошибка. Для этого нам понадобится выполнить проверку файла на существование. Импортируем для этого модуль fs и константы:

import fs from 'fs/promises'; import { constants } from 'fs';

Решим задачу с их помощью:

app.get('/page/:num/', function(req, res) { let path = __dirname + '/pages/' + req.params.num + '.html'; fs.access(path, constants.F_OK).then(() => { res.sendFile(path); }).catch(() => { res.status(404).send('not found'); }); });

Можно переписать код в синхронном стиле:

app.get('/page/:num/', async function(req, res) { let path = __dirname + '/pages/' + req.params.num + '.html'; try { await fs.access(path, constants.F_OK); res.sendFile(path); } catch(err) { res.status(404).send('not found'); } });

Модифицируйте предыдущую задачу так, чтобы для несуществующего файла отдавалась 404 ошибка.