web-dev-qa-db-fra.com

chemin absolu res.sendFile

Si je fais un

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

alors je reçois un avertissement de la console du serveur

obsolète exprès res.sendfile: utilisez res.sendFile à la place

mais cela fonctionne bien du côté client.

Mais quand je le change en

res.sendFile('public/index1.html');

Je reçois une erreur

TypeError: le chemin doit être absolu ou spécifier la racine à res.sendFile

et index1.html n'est pas rendu.

Je suis incapable de comprendre quel est le chemin absolu. J'ai le répertoire public au même niveau que server.js. Je fais le res.sendFile à partir de server.js. J'ai aussi déclaré app.use(express.static(path.join(__dirname, 'public')));

Ajout de ma structure de répertoire:

/Users/sj/test/
....app/
........models/
....public/
........index1.html

Quel est le chemin absolu à spécifier ici?

J'utilise Express 4.x.

115
Kaya Toast

Le middleware express.static étant distinct de res.sendFile, son initialisation avec un chemin absolu vers votre répertoire public ne fera rien à res.sendFile. Vous devez utiliser un chemin absolu directement avec res.sendFile. Il y a deux façons simples de le faire:

  1. res.sendFile(path.join(__dirname, '../public', 'index1.html'));
  2. 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, cela ressemble à server.js est dans app/. Donc, pour arriver à public, vous devrez d'abord revenir au niveau précédent: ../public/index1.html.

Remarque: path est un module intégré qui doit être required pour que le code ci-dessus fonctionne: var path = require('path');

270
Mike S

Essayez simplement ceci à la place:

res.sendFile('public/index1.html' , { root : __dirname});

Cela a fonctionné pour moi. la racine: __ dirname prendra l'adresse où server.js est 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.

41
Kshitij Choudhary
res.sendFile( __dirname + "/public/" + "index1.html" );

__dirname gérera le nom du répertoire dans lequel réside le script en cours d'exécution (server.js).

8
SOuřaan Gřg

Une alternative qui n'a pas encore été listée et qui a fonctionné pour moi consiste simplement à utiliser path.resolve avec soit des chaînes séparées, soit une seule chaîne avec le chemin complet:

// comma separated
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src', 'app', 'index.html') );
});

Ou

// just one string with the path
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src/app/index.html') );
});

(Nœud v6.10.0)

Idée provenant de https://stackoverflow.com/a/14594282/6189078

6
Phil Gibbins

Je l'ai essayé et ça marche.

app.get('/', function (req, res) {
    res.sendFile('public/index.html', { root: __dirname });
});
4
boms

Sur la base des autres réponses, il s'agit d'un exemple simple illustrant la manière de satisfaire à l'exigence la plus courante:

const app = express()
app.use(express.static('public')) // relative path of client-side code
app.get('*', function(req, res) {
    res.sendFile('index.html', { root: __dirname })
})
app.listen(process.env.PORT)

Cela constitue également un moyen simple de répondre avec index.html à chaque demande , car j’utilise une étoile * pour récupérer tous les fichiers qui ne se trouvaient pas dans votre fichier statique (public. ) répertoire; ce qui est le cas d'utilisation le plus courant pour les applications Web. Passez à / pour ne renvoyer l'index que dans le chemin racine.

3
Jaime Gómez

Une autre façon de faire cela en écrivant moins de code.

app.use(express.static('public'));

app.get('/', function(req, res) {
   res.sendFile('index.html');
});
3
Tim Anishere

process.cwd() renvoie le chemin absolu de votre projet.

Ensuite :

res.sendFile( `${process.cwd()}/public/index1.html` );
2
Abdennour TOUMI

vous pouvez utiliser send au lieu de sendFile pour éviter les erreurs! cela fonctionne vous aidera!

fs.readFile('public/index1.html',(err,data)=>{
if(err){
  consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');

pour indiquer au navigateur que votre réponse est du type PDF

res.setHeader('Content-Disposition', 'attachment; filename='your_file_name_for_client.pdf');

si vous voulez que ce fichier soit ouvert immédiatement sur la même page après que l'utilisateur a téléchargé it.write 'inline' à la place de la pièce jointe au code ci-dessus.

res.send(data)
0
Aref.T

Si vous voulez configurer ceci 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:

app.use((req, res, next) => {
  res.show = (name) => {
    res.sendFile(`/public/${name}`, {root: __dirname});
  };
  next();
});

Puis utilisez-le comme suit:

app.get('/demo', (req, res) => {
  res.show("index1.html");
});
0
danp

J'utilise Node.Js et ai le même problème ... J'ai résolu en ajoutant simplement un '/' au début de chaque script et un lien vers un fichier statique css.

Avant:

<link rel="stylesheet" href="assets/css/bootstrap/bootstrap.min.css">

Après:

<link rel="stylesheet" href="/assets/css/bootstrap/bootstrap.min.css">
0
Jackson D