J'ai ce code:
res.sendfile( '../../temp/index.html' )
Cependant, il jette cette erreur:
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)
Quelqu'un peut-il me dire pourquoi cela pourrait être?
res.sendfile
path.resolve
devrait faire ce dont vous avez besoin.Réponses:
Je crois que c'est à cause du chemin relatif; le "../" est considéré comme malveillant. Résolvez d'abord le chemin local, puis appelez
res.sendfile
. Vous pouvez résoudre le chemin avecpath.resolve
au préalable.la source
sendfile
comme mauvais. Sauf si vous spécifiez leroot
paramètre de répertoire, comme vu ici: github.com/visionmedia/express/issues/1465const
est préférable àvar
Cette réponse rassemble les informations des autres réponses / commentaires.
Cela dépend si vous souhaitez inclure quelque chose relatif au répertoire de travail du processus (cwd) ou au répertoire de fichiers. Les deux utilisent la
path.resolve
fonction (placéevar path = require('path')
en haut du fichier.path.resolve('../../some/path/to/file.txt');
path.resolve(__dirname+'../../some/path/to/file.txt');
En lisant le lien du commentaire de @ Joe, il semble que les chemins relatifs représentent un risque pour la sécurité si vous acceptez l'entrée de l'utilisateur pour le chemin (par exemple, cela
sendfile('../.ssh/id_rsa')
pourrait être le premier essai d'un pirate informatique).la source
La documentation Express suggère de le faire d'une manière différente, et à mon avis, cela a plus de sens plus tard que la solution actuelle.
res.sendFile('index.html', {root: './temp'});
L'option racine semble être définie
./
comme répertoire racine de votre projet. Je ne peux donc pas dire complètement où se trouve votre fichier par rapport à la racine du projet, mais si votre dossier temporaire s'y trouve, vous pouvez définir./temp
comme racine du fichier que vous envoyez.la source
.sendfile
mais parce qu'elle repose complètement sur autre chose (chemin). Merci de l'avoir signalé.