Si je fais un
res.sendfile('public/index1.html');
alors je reçois un avertissement de la console du serveur
express obsolète
res.sendfile
: à utiliser à lares.sendFile
place
mais cela fonctionne bien du côté client.
Mais quand je le change en
res.sendFile('public/index1.html');
J'obtiens une erreur
TypeError: le chemin doit être absolu ou spécifier la racine de
res.sendFile
et index1.html
n'est pas rendu.
Je suis incapable de comprendre quel est le chemin absolu. J'ai un public
répertoire au même niveau que server.js
. Je fais res.sendFile
du avec server.js
. J'ai aussi déclaréapp.use(express.static(path.join(__dirname, 'public')));
Ajout de ma structure de répertoires:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
Quel est le chemin absolu à spécifier ici?
J'utilise Express 4.x.
express.static
middleware pour servir votre annuaire public, pourquoi avez-vous besoinres.sendFile
d'envoyerpublic/index1.html
?res.sendFile
de l'intérieurapp.get('/', function(req, res){res.sendFile("...")})
pour l'envoyer à la demande.Réponses:
Le
express.static
middleware est séparé deres.sendFile
, donc l'initialiser avec un chemin absolu vers votrepublic
répertoire ne fera rienres.sendFile
. Vous devez utiliser un chemin absolu directement avecres.sendFile
. Il existe deux façons simples de le faire:res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Remarque:
__dirname
renvoie le répertoire dans lequel se trouve le script en cours d'exécution. Dans votre cas, il ressemble àserver.js
isapp/
. Alors, pour se rendre àpublic
, vous aurez besoin de retour à un premier niveau:../public/index1.html
.Remarque:
path
est un module intégré qui doit êtrerequire
d pour que le code ci-dessus fonctionne:var path = require('path');
la source
res.sendFile('../public/index.html', {root: __dirname});
fonctionne aussi et c'est plus courtconsole.log(path.join(__dirname, '../public', 'index.html'));
maisres.sendFile(path.join(__dirname, '../public', 'index.html'));
ne fonctionne qu'avecvar path = require('path');
res.sendFile('../public/index.html', {root: __dirname});
ne fonctionne pas (plus), car il renvoie 403 Forbidden en raison du dépassement de la racine. Faitesres.sendFile('public/index.html', {root: path.dirname(__dirname)});
plutôt.Essayez plutôt ceci:
Cela a fonctionné pour moi. la racine: __ dirname prendra l'adresse où se trouve server.js dans l'exemple ci-dessus, puis pour accéder à l'index1.html (dans ce cas), le chemin renvoyé consiste à accéder au répertoire où se trouve le dossier public.
la source
où
__dirname
gérera le nom du répertoire dans lequelserver.js
réside le script ( ) en cours d'exécution .la source
path
rend indépendant du système d' exploitation .Une alternative qui n'a pas encore été répertoriée et qui a fonctionné pour moi consiste simplement à utiliser
path.resolve
des chaînes séparées ou une seule avec le chemin complet:Ou
(Nœud v6.10.0)
Idée provenant de https://stackoverflow.com/a/14594282/6189078
la source
Sur la base des autres réponses, voici un exemple simple de la manière d'accomplir l'exigence la plus courante:
Cela sert également de moyen simple de répondre avec index.html à chaque demande , car j'utilise une étoile
*
pour attraper tous les fichiers qui n'ont pas été trouvés dans votre répertoire statique (public); qui est le cas d'utilisation le plus courant pour les applications Web. Remplacez par/
pour renvoyer l'index uniquement dans le chemin racine.la source
Je l'ai essayé et ça marche.
la source
process.cwd()
renvoie le chemin absolu de votre projet.Ensuite :
la source
Une autre façon de faire cela en écrivant moins de code.
la source
vous pouvez utiliser send au lieu de sendFile pour ne pas faire face à une erreur! cela fonctionne vous aidera!
pour indiquer au navigateur que votre réponse est de type PDF
si vous voulez que ce fichier s'ouvre immédiatement sur la même page après le téléchargement de l'utilisateur, écrivez «en ligne» à la place de la pièce jointe dans le code ci-dessus.
la source
Si vous souhaitez configurer cela une fois et l'utiliser partout, configurez simplement votre propre middleware. Lorsque vous configurez votre application, utilisez ce qui suit pour définir une nouvelle fonction sur l'objet de réponse:
Ensuite, utilisez-le comme suit:
la source
J'utilise Node.Js et j'ai eu le même problème ... J'ai résolu simplement en ajoutant un '/' au début de chaque script et un lien vers un fichier statique css.
Avant:
Après:
la source