Абсолютный путь res.sendFile
Если я делаю
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.
Ответы
Ответ 1
Связующее ПО 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
возвращает каталог, в котором находится текущий исполняемый script. В вашем случае это выглядит как server.js
находится в app/
. Итак, чтобы добраться до public
, сначала вам нужно вернуться на один уровень: ../public/index1.html
.
Примечание. path
- это встроенный модуль, который должен быть require
d для работы вышеприведенного кода: var path = require('path');
Ответ 2
Попробуйте вместо этого:
res.sendFile('public/index1.html' , { root : __dirname});
Это сработало для меня.
корень: __ dirname берет адрес, где server.js находится в приведенном выше примере, а затем, чтобы перейти к index1.html(в этом случае), возвращаемый путь - это получить каталог, в котором находится общая папка.
Ответ 3
res.sendFile( __dirname + "/public/" + "index1.html" );
где __dirname
будет управлять именем каталога, в котором находится текущий script (server.js
).
Ответ 4
Альтернатива, которая еще не указана в списке, которая использовалась для меня, просто использует path.resolve
с отдельными строками или только с одним контуром:
// comma separated
app.get('/', function(req, res) {
res.sendFile( path.resolve('src', 'app', 'index.html') );
});
или
// just one string with the path
app.get('/', function(req, res) {
res.sendFile( path.resolve('src/app/index.html') );
});
(Node v6.10.0)
Идея получена из fooobar.com/questions/50941/...
Ответ 5
Я пробовал это, и он работал.
app.get('/', function (req, res) {
res.sendFile('public/index.html', { root: __dirname });
});
Ответ 6
Другой способ сделать это, написав меньше кода.
app.use(express.static('public'));
app.get('/', function(req, res) {
res.sendFile('index.html');
});
Ответ 7
Основываясь на других ответах, это простой пример того, как выполнить наиболее распространенное требование:
const app = express()
app.use(express.static('public')) // relative path of client-side code
app.get('*', function(req, res) {
res.sendFile('index.html', { root: __dirname })
})
app.listen(process.env.PORT)
Это также удваивается как простой способ отвечать index.html на каждый запрос, потому что я использую звездочку *
чтобы перехватить все файлы, которые не были найдены в вашей статической (публичной) директории; который является наиболее распространенным вариантом использования веб-приложений. Измените на /
чтобы вернуть индекс только в корневом пути.
Ответ 8
process.cwd()
возвращает абсолютный путь вашего проекта.
Тогда:
res.sendFile( `${process.cwd()}/public/index1.html` );
Ответ 9
Если вы хотите настроить это один раз и использовать его везде, просто настройте свое промежуточное программное обеспечение. Когда вы настраиваете свое приложение, используйте следующее, чтобы определить новую функцию для объекта ответа:
app.use((req, res, next) => {
res.show = (name) => {
res.sendFile('/public/${name}', {root: __dirname});
};
next();
});
Затем используйте его следующим образом:
app.get('/demo', (req, res) => {
res.show("index1.html");
});
Ответ 10
Я использую Node.Js и у меня возникла та же проблема... Я решил просто добавить '/' в начале каждого скрипта и ссылку на статический файл CSS.
До:
<link rel="stylesheet" href="assets/css/bootstrap/bootstrap.min.css">
После:
<link rel="stylesheet" href="/assets/css/bootstrap/bootstrap.min.css">
Ответ 11
Вы можете использовать send вместо sendFile, чтобы не столкнуться с ошибкой! это поможет вам!
fs.readFile('public/index1.html',(err,data)=>{
if(err){
consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');
за сообщение браузеру, что ваш ответ типа PDF
res.setHeader('Content-Disposition', 'attachment; filename='your_file_name_for_client.pdf');
если вы хотите, чтобы этот файл открывался сразу же на той же странице после того, как пользователь загрузил его, напишите "inline" вместо вложения в приведенном выше коде.
res.send(data)