Экспресс res.sendfile, бросающий запрещенную ошибку

У меня есть этот код:

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 локальный путь, затем вызовите res.sendfile . Вы можете разрешить путь с path.resolve заранее.

 var path = require('path'); res.sendFile(path.resolve('temp/index.html')); 

Этот ответ собирает информацию из других ответов / комментариев.

Это зависит от того, хотите ли вы включить что-то относительно рабочего каталога процесса (cwd) или каталога файлов. Оба используют функцию path.resolve (поместите var path = require('path') в начало файла.

  • относительно cwd: 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'});

Предполагается, что параметр root установлен ./ как корневой каталог вашего проекта. Поэтому я не могу полностью указать, где вы находитесь, в отношении корня проекта, но если ваша временная папка существует, вы можете установить ./temp в качестве корня для отправляемого файла.

  • Правильный способ возврата JSON с помощью узла или Express
  • Обратный звонок в nodejs?
  • Облачные функции для Firebase - getaddrinfo ENOTFOUND
  • Как я могу увидеть SQL, созданный Sequelize.js?
  • Захват Node JS альтернатива многопоточности
  • Как использовать переменную как имя поля в mongodb-native findOne ()?
  • Изменить расположение узла node_modules
  • У node.js эквивалент объекта window в браузере
  • FATAL ERROR: CALL_AND_RETRY_LAST Не удалось выполнить выделение - процесс из памяти
  • Укажите путь к node_modules в package.json
  • Как установить модуль глобально с помощью npm?
  • Давайте будем гением компьютера.