Express res.sendfile jetant une erreur interdite

J’ai ce code:

res.sendfile( '../../temp/index.html' ) 

Cependant, cette erreur se produit:

 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?

Je crois que c’est à cause du chemin relatif; le “../” est considéré comme malveillant. Résolvez d’abord le chemin d’access local, puis appelez res.sendfile . Vous pouvez résoudre le chemin avec path.resolve au préalable.

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

Cette réponse rassemble les informations des autres réponses / commentaires.

Cela dépend si vous voulez inclure quelque chose par rapport au répertoire de travail du processus (cwd) ou au répertoire de fichiers. Les deux utilisent la fonction path.resolve (mettez var path = require('path') en haut du fichier.

  • relatif à cwd: path.resolve('../../some/path/to/file.txt');
  • relatif au fichier: path.resolve(__dirname+'../../some/path/to/file.txt');

En lisant le lien du commentaire de @ Joe, il semble que les chemins relatifs présentent un risque de sécurité si vous acceptez les entrées utilisateur pour le chemin (par exemple, sendfile('../.ssh/id_rsa') peut être un premier essai).

La documentation d’Express suggère de le faire d’une manière différente, et à mon avis, cela a plus de sens après la solution actuelle.

res.sendFile('index.html', {root: './temp'});

L’option root semble définir ./ comme répertoire racine de votre projet. Donc, je ne peux pas entièrement dire où est votre fichier par rapport à la racine du projet, mais si votre dossier temporaire est là, vous pouvez définir ./temp comme racine du fichier que vous envoyez.