Eu tenho este código:
res.sendfile( '../../temp/index.html' )
No entanto, ele lança este erro:
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)
Alguém pode me dizer por que isso pode ser?
res.sendfile
path.resolve
deve fazer o que você precisa.Respostas:
Eu acredito que é por causa do caminho relativo; o "../" é considerado malicioso. Resolva o caminho local primeiro e depois ligue
res.sendfile
. Você pode resolver o caminho compath.resolve
antecedência.fonte
sendfile
ruins. A menos que você especificar oroot
parâmetro de diretório, como visto aqui: github.com/visionmedia/express/issues/1465const
é preferido sobrevar
Esta resposta reúne as informações das outras respostas / comentários.
Depende se você deseja incluir algo relativo ao diretório ativo do processo (cwd) ou ao diretório do arquivo. Ambos usam a
path.resolve
função (coloquevar path = require('path')
na parte superior do arquivo.path.resolve('../../some/path/to/file.txt');
path.resolve(__dirname+'../../some/path/to/file.txt');
Ao ler o link do comentário de @ Joe, parece que os caminhos relativos são um risco de segurança se você aceitar a entrada do usuário para o caminho (por exemplo,
sendfile('../.ssh/id_rsa')
pode ser a primeira tentativa de um hacker).fonte
A documentação do Express sugere fazê-lo de uma maneira diferente e, na minha opinião, faz mais sentido depois da solução atual.
res.sendFile('index.html', {root: './temp'});
A opção raiz parece definir
./
como o diretório raiz do seu projeto. Portanto, não sei exatamente onde está o seu arquivo em relação à raiz do projeto, mas se a sua pasta temporária estiver lá, você poderá definir./temp
como a raiz do arquivo que está enviando.fonte
.sendfile
mas porque depende de outra coisa completamente (caminho). Obrigado por apontar isso.