2016-01-16 6 views
1

Привет, ребята, я работаю над этим явным приложением. В верхней части моей экспресс-файла, который я написал эту строку, так как все мои статические файлы находятся в моем рабочем каталоге:Доступ к родительским папкам Express

app.use(express.static(__dirname)); 

Теперь я хочу, чтобы отправить файл, который существует в родительской папке текущей папки:

app.get('/test', function(req, res) { 
res.sendFile("../../test.html"); 
}); 

Это не сработало для меня, как правило, потому что все статические файлы должны существовать в каталоге defind above, Мог ли я сделать исключение и заставить мой код работать?

ответ

4

express.static и res.sendFile ничего не знают друг о друге. Они happen to share a lot of the same internals, но на самом деле не связаны.

Вы можете разместить test.html, где хотите, а затем ссылаться на него с помощью встроенного модуля Node path. Например, если ваша структура файла выглядит следующим образом:

test.html 
real-app/ 
├── app.js 
├── node_modules/ 
└── package.json 

Тогда вы можете отправить test.html так:

var path = require('path'); 

// ... 

app.get('/test', function(req, res) { 
    var testHtmlPath = path.resolve(__dirname, '..', '..', 'test.html'); 
    res.sendFile(testHtmlPath); 
}); 

PS: Я бы не рекомендовал путь вы посылаете статический файлы. Случая файлы из того же каталога, что и ваш код приложения (что означает то, что означает __dirname), может вызвать code disclosure, которые хакеры могут использовать для использования проблем в вашем коде. Например, если хакер посетил этот URL:

http://yourapp.com/app.js

Они смогли бы увидеть app.js, который имеет весь код вашего приложения. Вы не хотите раскрывать это хакеру! Они также могут перемещаться по таким маршрутам, как /secret-passwords.json или другим подобным файлам.

Как правило, статические файлы помещаются в специальный каталог, который часто называют static или public. Вы можете служить файлы из этого каталога, как это:

var path = require('path'); 

// ... 

var staticFilesPath = path.resolve(__dirname, 'public'); 
app.use(express.static(staticFilesPath)); 

В общем, вы должны быть очень осторожны, о передаче файлов, которые живут за пределами кода вашего приложения.

Надеюсь, это поможет!

+0

Я писал ответ, содержащий ту же информацию, но ваш аккуратно написан. Chapeau :) – Hisham

+0

Большое спасибо @Evan Hahn, для общей папки, я еще не реализовал, потому что я начал разрабатывать свое приложение, но, конечно же, я его создам – user3510821