У меня есть этот код:
res.sendfile( '../../temp/index.html' )
Тем не менее, он выдает эту ошибку:
Error: Forbidden
at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.pipe (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:307:39)
at ServerResponse.res.sendfile (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:339:8)
at exports.boot (/Users/Oliver/Development/Personal/Reader/server/config/routes.js:18:9)
at callbacks (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/proto.js:199:15)
Может кто-нибудь сказать мне, почему это может быть?
res.sendfile
path.resolve
должен делать то, что вам нужно.Ответы:
Я верю, что это из-за относительного пути; «../» считается злонамеренным. Сначала разрешите локальный путь, затем позвоните
res.sendfile
. Вы можете решить путь сpath.resolve
заранее.источник
sendfile
плохими. Если вы не укажетеroot
параметр каталога, как показано здесь: github.com/visionmedia/express/issues/1465const
предпочтительнееvar
Этот ответ собирает информацию из других ответов / комментариев.
Это зависит от того, хотите ли вы включить что-то относительно рабочего каталога процесса (cwd) или файлового каталога. Оба используют
path.resolve
функцию (поставитьvar path = require('path')
в верхней части файла.path.resolve('../../some/path/to/file.txt');
path.resolve(__dirname+'../../some/path/to/file.txt');
Прочитав ссылку из комментария @ Joe, вы узнаете, что относительные пути представляют угрозу безопасности, если вы принимаете ввод данных пользователем (например, это
sendfile('../.ssh/id_rsa')
может быть первая попытка хакера).источник
Документация Express предлагает сделать это по-другому, и, на мой взгляд, это имеет смысл позже, чем текущее решение.
res.sendFile('index.html', {root: './temp'});
Корневая опция, кажется, устанавливается
./
в качестве корневого каталога вашего проекта. Поэтому я не могу полностью сказать, где находится ваш файл по отношению к корню проекта, но если ваша временная папка там, вы можете установить./temp
в качестве корня для файла, который вы отправляете.источник
.sendfile
а потому, что он полностью зависит от чего-то другого (путь). Спасибо за указание на это.