Абсолютный путь 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)