Si hago un
res.sendfile('public/index1.html');
entonces recibo una advertencia de consola del servidor
Expresar en desuso
res.sendfile
: utilizar en sures.sendFile
lugar
pero funciona bien en el lado del cliente.
Pero cuando lo cambio a
res.sendFile('public/index1.html');
Me sale un error
TypeError: la ruta debe ser absoluta o especificar raíz para
res.sendFile
y index1.html
no se presta
No puedo entender cuál es el camino absoluto. Tengo un public
directorio al mismo nivel que server.js
. Estoy haciendo el res.sendFile
de con server.js
. También he declaradoapp.use(express.static(path.join(__dirname, 'public')));
Agregar mi estructura de directorio:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
¿Cuál es la ruta absoluta que se especificará aquí?
Estoy usando Express 4.x.
express.static
middleware para servir su directorio público, ¿por qué necesitares.sendFile
enviarlopublic/index1.html
?res.sendFile
desde dentroapp.get('/', function(req, res){res.sendFile("...")})
para enviarlo a pedido.Respuestas:
El
express.static
middleware está separado deres.sendFile
, por lo que inicializarlo con una ruta absoluta a supublic
directorio no hará nadares.sendFile
. Necesita utilizar una ruta absoluta directamente conres.sendFile
. Hay dos formas simples de hacerlo:res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Nota:
__dirname
devuelve el directorio en el que se encuentra el script que se está ejecutando actualmente. En su caso, parece queserver.js
está enapp/
. Por lo tanto, llegar apublic
, tendrá que volver a cabo de una sola planta primera:../public/index1.html
.Nota:
path
es un módulo incorporado que necesita serrequire
d para que el código anterior funcione:var path = require('path');
fuente
res.sendFile('../public/index.html', {root: __dirname});
también funciona y es más cortoconsole.log(path.join(__dirname, '../public', 'index.html'));
perores.sendFile(path.join(__dirname, '../public', 'index.html'));
solo trabajo convar path = require('path');
res.sendFile('../public/index.html', {root: __dirname});
ya no funciona, ya que devuelve 403 Prohibido por ir por encima de la raíz. Hazlo en sures.sendFile('public/index.html', {root: path.dirname(__dirname)});
lugar.Solo intenta esto en su lugar:
Esto funcionó para mí. la raíz: __ dirname tomará la dirección donde se encuentra server.js en el ejemplo anterior y luego para llegar al index1.html (en este caso) la ruta devuelta es llegar al directorio donde está la carpeta pública.
fuente
donde
__dirname
administrará el nombre del directorio en el queserver.js
reside el script que se está ejecutando actualmente ( ).fuente
path
hace independiente del sistema operativo .Una alternativa que aún no se ha enumerado y que funcionó para mí es simplemente usar
path.resolve
con cadenas separadas o solo una con toda la ruta:O
(Nodo v6.10.0)
Idea obtenida de https://stackoverflow.com/a/14594282/6189078
fuente
Basado en las otras respuestas, este es un ejemplo simple de cómo cumplir con el requisito más común:
Esto también funciona como una forma simple de responder con index.html en cada solicitud , porque estoy usando una estrella
*
para capturar todos los archivos que no se encontraron en su directorio estático (público); que es el caso de uso más común para aplicaciones web. Cambie a/
para devolver el índice solo en la ruta raíz.fuente
Intenté esto y funcionó.
fuente
process.cwd()
Devuelve la ruta absoluta de su proyecto.Luego :
fuente
Otra forma de hacerlo escribiendo menos código.
fuente
¡puedes usar send en lugar de sendFile para que no te enfrentes con error! ¡Esto funciona te ayudará!
para decirle al navegador que su respuesta es un tipo de PDF
si desea que el archivo se abra inmediatamente en la misma página después de que el usuario lo descargue, escriba 'en línea' en lugar del archivo adjunto en el código anterior.
fuente
Si desea configurar esto una vez y usarlo en todas partes, simplemente configure su propio middleware. Cuando configure su aplicación, utilice lo siguiente para definir una nueva función en el objeto de respuesta:
Luego úsalo de la siguiente manera:
fuente
Utilicé Node.Js y tuve el mismo problema ... resolví simplemente agregando un '/' al comienzo de cada script y enlace a un archivo estático css.
Antes de:
Después:
fuente