res. sendfile абсолютный путь
если я делаю
res.sendfile('public/index1.html');
тогда я получаю предупреждение консоли сервера
экспресс-устаревший
res.sendfileиспользуйтеres.sendFileвместо
но он отлично работает на стороне клиента.
но когда я меняю его на
res.sendFile('public/index1.html');
я получаю сообщение об ошибке
TypeError: путь должен быть абсолютным или указывать root на
res.sendFile
и index1.html не отображается.
I я не могу понять, что такое абсолютный путь. У меня есть public каталог на том же уровне, что и server.js. Я делаю res.sendFile С server.js. Я также заявил app.use(express.static(path.join(__dirname, 'public')));
добавление моей структуры каталогов:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
какой абсолютный путь должен быть указан здесь ?
я использую Экспресс-4.x.
9 ответов:
The
express.staticmiddleware является отдельной от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встроенный модуль это должно бытьrequired для приведенного выше кода для работы:var path = require('path');
просто попробуйте это вместо этого:
res.sendFile('public/index1.html' , { root : __dirname});это сработало для меня. корень:__dirname будет принимать адрес, где сервер.js находится в приведенном выше примере, а затем, чтобы добраться до index1.html (в этом случае) возвращаемый путь должен попасть в каталог, где находится общая папка.
res.sendFile( __dirname + "/public/" + "index1.html" );здесь
__dirnameбудет управлять именем каталога, в котором выполняется текущий скрипт (server.js) проживает в.
альтернатива, которая еще не была указана, которая работала для меня, просто использует
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') ); });(узел В6.10.0)
идея получена из https://stackoverflow.com/a/14594282/6189078
я попробовал это, и это сработало.
app.get('/', function (req, res) { res.sendFile('public/index.html', { root: __dirname }); });
другой способ сделать это, написав меньше кода.
app.use(express.static('public')); app.get('/', function(req, res) { res.sendFile('index.html'); });
process.cwd()возвращает абсолютный путь вашего проекта.затем :
res.sendFile( `${process.cwd()}/public/index1.html` );
основываясь на других ответах, это простой пример того, как выполнить наиболее распространенное требование:
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)Это также удваивается как простой способ ответить с индексом.HTML на каждый запрос, потому что я использую звезды
*чтобы поймать все файлы, которые не были найдены в вашем статическом (общедоступном) каталоге; что является наиболее распространенным вариантом использования для веб-приложений. Изменить на/возвращает индекс только в корневом пути.
Если вы хотите настроить это один раз и использовать его везде, просто настройте свое собственное промежуточное программное обеспечение. При настройке приложения используйте следующее, Чтобы определить новую функцию для объекта ответа:
app.use((req, res, next) => { res.show = (name) => { res.sendFile(`/public/${name}`, {root: __dirname}); }; next(); });затем используйте его следующим образом:
app.get('/demo', (req, res) => { res.show("index1.html"); });
Comments