Если я сделаю
res.sendfile('public/index1.html');
тогда я получаю предупреждение консоли сервера
Экспресс устарел
res.sendfile
: используйтеres.sendFile
вместо
но он прекрасно работает на стороне клиента.
Но когда я изменяю это на
res.sendFile('public/index1.html');
Я получаю ошибку
TypeError: путь должен быть абсолютным или указывать root на
res.sendFile
и index1.html
не отображается.
Я не могу понять, что такое абсолютный путь. У меня есть public
каталог на том же уровне, что и server.js
. Я делаю res.sendFile
из с server.js
. Я также объявилapp.use(express.static(path.join(__dirname, 'public')));
Добавление моей структуры каталогов:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
Какой абсолютный путь должен быть указан здесь?
Я использую Express 4.x.
express.static
промежуточное ПО для обслуживания общедоступного каталога, зачем вамres.sendFile
отправлятьpublic/index1.html
?res.sendFile
изнутри,app.get('/', function(req, res){res.sendFile("...")})
чтобы отправить по требованию.Ответы:
express.static
Промежуточный слой отдельно отres.sendFile
, так инициализации абсолютного путем к вашейpublic
директории ничего не будет делать , чтобыres.sendFile
. Вам нужно использовать абсолютный путь напрямую сres.sendFile
. Это можно сделать двумя простыми способами:res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Примечание.
__dirname
Возвращает каталог, в котором находится текущий исполняемый скрипт. В вашем случае он выглядит так, как будтоserver.js
находится вapp/
. Таким образом, чтобы добраться доpublic
, вам нужно вернуться из одного уровня первого:../public/index1.html
.Примечание:
path
это встроенный модуль, который необходимо выполнитьrequire
для работы приведенного выше кода:var path = require('path');
источник
res.sendFile('../public/index.html', {root: __dirname});
тоже работает и корочеconsole.log(path.join(__dirname, '../public', 'index.html'));
ноres.sendFile(path.join(__dirname, '../public', 'index.html'));
работает только сvar path = require('path');
res.sendFile('../public/index.html', {root: __dirname});
не работает (больше), так как возвращает 403 Forbidden из-за превышения корня. Делайres.sendFile('public/index.html', {root: path.dirname(__dirname)});
вместо этого.Просто попробуйте это вместо:
Это сработало для меня. корень: __dirname возьмет адрес, где находится server.js в приведенном выше примере, а затем, чтобы добраться до index1.html (в данном случае), возвращаемый путь - это каталог, в котором находится общая папка.
источник
where
__dirname
будет управлять именем каталога, в котором находится исполняемый в данный момент script (server.js
).источник
path
делает его независимым от ОС .Альтернатива, которая еще не была указана, которая сработала для меня, просто использует
path.resolve
либо отдельные строки, либо только одну со всем путем:Или
(Узел v6.10.0)
Идея взята из https://stackoverflow.com/a/14594282/6189078
источник
Основываясь на других ответах, это простой пример того, как выполнить наиболее распространенное требование:
Это также служит простым способом ответа index.html на каждый запрос , потому что я использую звездочку,
*
чтобы перехватить все файлы, которые не были найдены в вашем статическом (общедоступном) каталоге; что является наиболее распространенным вариантом использования веб-приложений. Измените значение на,/
чтобы вернуть индекс только в корневом пути.источник
Я попробовал это, и это сработало.
источник
process.cwd()
возвращает абсолютный путь вашего проекта.Затем :
источник
Другой способ сделать это, написав меньше кода.
источник
вы можете использовать send вместо sendFile, чтобы не столкнуться с ошибкой! эта работа вам поможет!
чтобы сообщить браузеру, что ваш ответ - это тип PDF
если вы хотите, чтобы этот файл открывался сразу на той же странице после того, как пользователь загрузил его. напишите «встроенный» вместо вложения в код выше.
источник
Если вы хотите настроить это один раз и использовать везде, просто настройте собственное промежуточное ПО. Когда вы настраиваете свое приложение, используйте следующее, чтобы определить новую функцию для объекта ответа:
Затем используйте его следующим образом:
источник
Я использую Node.Js, и у меня была та же проблема ... Я решил просто добавить '/' в начале каждого скрипта и ссылку на статический файл css.
Перед:
После:
источник