Ошибка отправки файла экспресс-маршрутизации узла в зависимости от местоположения файла

У меня есть структура каталогов для спокойного экспресс-сервиса + клиент Backbone с включенным pushState (клиентский код в public/)

app.js
lib/routes.js
-- public/
   -- index.html

Я установил /public как статический каталог в app.configure:

app.use(express.static(__dirname + '/public'));

Это уже работает с места в карьер, если индекс посещается первым.

Затем, когда я напрямую посещаю маршрут, отличный от домашней страницы, я перенаправляюсь на index.html. Это прекрасно работает в app.js, но если я попытаюсь вставить это в lib/routes.js, я получу ошибку Forbidden:

От app.js отлично работает:

app.get('*', function(req, res) {
    res.sendfile(__dirname + '/public/index.html');
});

От lib/routes.js:

res.sendfile(__dirname + '../public/index.html');

Дает мне:

Error: Forbidden
        at SendStream.error (/Users/*****/Sites/myproject/node_modules/express/node_modules/send/lib/send.js:145:16)
        at SendStream.pipe (/Users/*****/Sites/myproject/node_modules/express/node_modules/send/lib/send.js:307:39)
        at ServerResponse.res.sendfile (/Users/*****/Sites/myproject/node_modules/express/lib/response.js:345:8)
        at /Users/*****/Sites/myproject/lib/routes.js:8:7
        at callbacks (/Users/*****/Sites/myproject/node_modules/express/lib/router/index.js:164:37)
        at param (/Users/*****/Sites/myproject/node_modules/express/lib/router/index.js:138:11)
        at pass (/Users/*****/Sites/myproject/node_modules/express/lib/router/index.js:145:5)
        at Router._dispatch (/Users/*****/Sites/myproject/node_modules/express/lib/router/index.js:173:5)
        at Object.router (/Users/*****/Sites/myproject/node_modules/express/lib/router/index.js:33:10)
        at next (/Users/*****/Sites/myproject/node_modules/express/node_modules/connect/lib/proto.js:193:15)

Если я просто попробую:

res.sendfile('/public/index.html');

Он не может найти файл, и я получаю:

Error: ENOENT, stat '/public/index.html'

Подводя итог, как я могу использовать sendFile и передать public/index.html из lib/routes.js, не получая запрещенную ошибку?


person Dominic    schedule 06.04.2014    source источник
comment
возможный дубликат Express res.sendfile выдает запрещенную ошибку   -  person Joe    schedule 07.04.2014
comment
Это из-за относительного пути в ../public/index.html. Смотрите обман.   -  person Joe    schedule 07.04.2014


Ответы (1)


Спасибо @Джо. Для полноты, поскольку обман не очень ясен, и попытки использовать различные относительные пути, включая попытку {root: 'somepath'}, поскольку 2-й параметр не сработали, вот что я сделал:

var path = require('path');
...
app.get('*', function(req, res) {
    res.sendfile(path.resolve('public/index.html'));
});

Несмотря на то, что он находится в каталоге lib/, он разрешен с использованием базового каталога, повторное повторение относительного разрешения не сработало для меня, но может быть какой-то способ сделать это.

person Dominic    schedule 06.04.2014