Короткий ответ: для одного конкретного файла используйте response.sendFile(), а для папки с картинками, CSS, PDF или HTML-файлами — express.static(). В обоих случаях путь к файлу лучше собирать через модуль path, чтобы не зависеть от текущей папки запуска
Запрос «как в node js express отдать файл по ссылке» обычно возникает, когда сервер уже отвечает текстом или JSON, но теперь надо сделать ссылку на файл: скачать PDF, открыть картинку, отдать HTML-страницу или показать документ из папки public
Отдать один файл через sendFile
Создайте структуру
project/
server.js
files/
guide.pdf
Файл server.js
const express = require("express");
const path = require("path");
const app = express();
app.get("/download/guide", (request, response) => {
const filePath = path.join(__dirname, "files", "guide.pdf");
response.sendFile(filePath);
});
app.listen(3000, () => {
console.log("Сервер запущен: http://localhost:3000");
});
Откройте в браузере
http://localhost:3000/download/guide
Express найдет файл и отправит его клиенту
Почему нужен path.join
Новички часто пишут путь строкой вроде "./files/guide.pdf". Иногда это работает, а потом ломается при запуске из другой папки. __dirname указывает на папку текущего файла, а path.join аккуратно собирает путь под вашу операционную систему
Так надежнее
const filePath = path.join(__dirname, "files", "guide.pdf");
Отдать папку файлов через express.static
Если нужно открыть много файлов по ссылкам, удобнее статическая папка
project/
server.js
public/
index.html
style.css
images/
logo.png
Код
const express = require("express");
const path = require("path");
const app = express();
app.use("/static", express.static(path.join(__dirname, "public")));
app.listen(3000, () => {
console.log("Сервер запущен: http://localhost:3000");
});
Теперь файл public/images/logo.png будет доступен по адресу
http://localhost:3000/static/images/logo.png
Как сделать скачивание вместо открытия
Если файл нужно именно скачать, используйте response.download()
app.get("/download/guide", (request, response) => {
const filePath = path.join(__dirname, "files", "guide.pdf");
response.download(filePath, "node-guide.pdf");
});
Браузер будет воспринимать ответ как файл для скачивания
Как не сделать дыру в безопасности
Не берите имя файла из адрес и не склеивайте путь напрямую
const filePath = "./files/" + request.params.name;
Так можно случайно открыть доступ не к тем файлам. Если нужно отдавать файлы по имени, заведите белый список или проверяйте, что путь остается внутри разрешенной папки
Мини-практика
Создайте папку public, положите туда index.html и style.css, подключите express.static, откройте HTML по ссылке. Затем сделайте отдельный маршрут /download/readme, который отдает один файл через response.download()
Частые ошибки
Файл не найден Проверьте реальный путь через console.log(filePath). Часто сервер запускается из другой папки
Картинка не открывается по ссылке Проверьте, подключена ли статическая папка и правильно ли указан префикс /static
HTML скачивается, а не открывается Для открытия используйте sendFile, для скачивания — download
Путь работает на macOS, но ломается на Windows Не собирайте путь вручную через /. Используйте path.join
Что почитать дальше по Node.js
Если нужен общий маршрут по теме, откройте рубрику Node.js. Для соседних задач пригодятся эти разборы:
- Как достать данные из модуля с базой в Node.js Express
- Как запустить JS-файл через Node.js: терминал, папка и первый вывод
- Как запустить сервер Node.js: простой HTTP-сервер и Express
- Как начать разработку на Node.js: первый проект, файл и запуск



