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
: utilisezres.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.
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:
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, 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 require
d pour que le code ci-dessus fonctionne: var path = require('path');
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.
res.sendFile( __dirname + "/public/" + "index1.html" );
où __dirname
gérera le nom du répertoire dans lequel réside le script en cours d'exécution (server.js
).
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
Je l'ai essayé et ça marche.
app.get('/', function (req, res) {
res.sendFile('public/index.html', { root: __dirname });
});
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.
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');
});
process.cwd()
renvoie le chemin absolu de votre projet.
Ensuite :
res.sendFile( `${process.cwd()}/public/index1.html` );
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)
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");
});
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">