node.js - tutorial - serve-static
Servidor rápido de archivos Node.js(archivos estáticos sobre HTTP) (27)
¿Existe la herramienta lista para usar Node.js (instalada con npm
) que me ayudaría a exponer el contenido de la carpeta como servidor de archivos a través de HTTP?
Ejemplo, si tengo
D:/Folder/file.zip
D:/Folder/file2.html
D:/Folder/folder/file-in-folder.jpg
Luego, comenzando en D:/Folder/
node node-file-server.js
pude acceder al archivo a través de
http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg
¿Por qué mi servidor de archivos estáticos de nodo está eliminando solicitudes? referencia alguna mística
servidor de archivos estáticos estándar node.js
Si no existe tal herramienta, ¿qué marco debería usar?
Relacionados: Servidor de archivos estáticos básicos en NodeJS
DEMO / PROTO SERVIDOR SOLAMENTE
Si eso es todo lo que necesitas, prueba esto:
const http = require(''http'');
const fs = require(''fs'');
const port = 3000;
const app = http.createServer((req,res) => {
res.writeHead(200);
res.end(fs.readFileSync(__dirname + req.url));
});
app.listen(port);
nota: debe usar "/index.html" como parte de su dirección, es decir, " http://localhost:3000/index.html "
Pruebas One-line ™ en lugar de promesas
El primero es http-server
, hs
- link
npm i -g http-server // install
hs C:/repos // run with one line?? FTW!!
El segundo es serve
por ZEIT.co - link
npm i -g serve // install
serve C:/repos // run with one line?? FTW!!
Las siguientes son opciones disponibles, si esto es lo que te ayuda a decidir.
C:/Users/Qwerty>http-server --help usage: http-server [path] [options] options: -p Port to use [8080] -a Address to use [0.0.0.0] -d Show directory listings [true] -i Display autoIndex [true] -g --gzip Serve gzip files when possible [false] -e --ext Default file extension if none supplied [none] -s --silent Suppress log messages from output --cors[=headers] Enable CORS via the "Access-Control-Allow-Origin" header Optionally provide CORS headers list separated by commas -o [path] Open browser window after starting the server -c Cache time (max-age) in seconds [3600], e.g. -c10 for 10 seconds. To disable caching, use -c-1. -U --utc Use UTC time format in log messages. -P --proxy Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com -S --ssl Enable https. -C --cert Path to ssl cert file (default: cert.pem). -K --key Path to ssl key file (default: key.pem). -r --robots Respond to /robots.txt [User-agent: */nDisallow: /] -h --help Print this list and exit.
C:/Users/Qwerty>serve --help Usage: serve.js [options] [command] Commands: help Display help Options: -a, --auth Serve behind basic auth -c, --cache Time in milliseconds for caching files in the browser -n, --clipless Don''t copy address to clipboard (disabled by default) -C, --cors Setup * CORS headers to allow requests from any origin (disabled by default) -h, --help Output usage information -i, --ignore Files and directories to ignore -o, --open Open local address in browser (disabled by default) -p, --port Port to listen on (defaults to 5000) -S, --silent Don''t log anything to the console -s, --single Serve single page applications (sets `-c` to 1 day) -t, --treeless Don''t display statics tree (disabled by default) -u, --unzipped Disable GZIP compression -v, --version Output the version number
Si necesita observar los cambios, vea hostr
, acredite la respuesta de Henry Tseng
Aquí hay otro servidor web simple.
Instalar
npm install -g hostr
Cambio de director de trabajo
cd myprojectfolder/
Y empezar
hostr
Buscando en el registro de NPM https://npmjs.org/search?q=server , he encontrado https://github.com/maelstrom/static-server
¿Alguna vez ha necesitado enviar un archivo a un colega, pero no se puede molestar en enviar un correo electrónico a la bestia de 100 MB? ¿Deseaba ejecutar una aplicación de ejemplo de JavaScript simple, pero tuvo problemas para ejecutarla a través del archivo: /// protocolo? ¿Desea compartir su directorio de medios en una LAN sin configurar Samba o FTP, o cualquier otra cosa que requiera que edite archivos de configuración? Entonces este servidor de archivos hará tu vida un poco más fácil.
Para instalar el servidor de cosas estáticas simple, use npm:
npm install -g static-server
Luego para servir un archivo o un directorio, simplemente ejecute
$ serve path/to/stuff Serving path/to/stuff on port 8001
Eso podría incluso listar el contenido de la carpeta.
Desafortunadamente, no pudo servir archivos :)
Echa un vistazo en ese link .
Solo necesitas instalar el módulo express de node js
.
var express = require(''express'');
var app = express();
app.use(''/Folder'', express.static(__dirname + ''/Folder''));
Puede acceder a su archivo como http://hostname/Folder/file.zip
Hay otro servidor web estático que es bastante bueno: sincronización de navegador.
Se puede descargar usando el administrador de paquetes de nodo:
npm install -g browser-sync
Después de la instalación, navegue a la carpeta del proyecto en el indicador de cmd y simplemente ejecute lo siguiente:
browser-sync start --server --port 3001 --files="./*"
Comenzará a atender todos los archivos en la carpeta actual en el navegador.
Más se puede encontrar en browser-sync
Gracias.
Instale Express utilizando npm: https://expressjs.com/en/starter/installing.html
Cree un archivo llamado server.js en el mismo nivel de su index.html con este contenido:
var express = require(''express'');
var server = express();
server.use(''/'', express.static(__dirname + ''/''));
server.listen(8080);
Si desea colocarlo en una ubicación diferente, establezca la ruta en la tercera línea:
server.use(''/'', express.static(__dirname + ''/public''));
CD a la carpeta que contiene su archivo y ejecute el nodo desde la consola con este comando:
node server.js
Navegar a localhost: 8080
No he tenido mucha suerte con ninguna de las respuestas en esta página, sin embargo, a continuación parece haber sido el truco.
Agregue un archivo server.js
con el siguiente contenido:
const express = require(''express'')
const path = require(''path'')
const port = process.env.PORT || 3000
const app = express()
// serve static assets normally
app.use(express.static(__dirname + ''/dist''))
// handle every other route with index.html, which will contain
// a script tag to your application''s JavaScript file(s).
app.get(''*'', function (request, response){
response.sendFile(path.resolve(__dirname, ''dist'', ''index.html''))
})
app.listen(port)
console.log("server started on port " + port)
También asegúrese de que necesita express
. Ejecute yarn add express --save
o npm install express --save
dependiendo de su configuración (puedo recomendar que es bastante rápido).
Puede cambiar dist
a cualquier carpeta en la que esté sirviendo su contenido. Para mi proyecto simple, no estaba sirviendo desde ninguna carpeta, así que simplemente dist
nombre del archivo dist
.
Entonces puedes ejecutar node server.js
. Como tenía que cargar mi proyecto en un servidor Heroku, necesitaba agregar lo siguiente a mi archivo package.json
:
"scripts": {
"start": "node server.js"
}
Para el beneficio de los buscadores, me gustó la respuesta de Jakub g, pero quería un poco de manejo de errores. Obviamente, es mejor manejar los errores properly , pero esto debería ayudar a evitar que un sitio se detenga si se produce un error. Código abajo:
var http = require(''http'');
var express = require(''express'');
process.on(''uncaughtException'', function(err) {
console.log(err);
});
var server = express();
server.use(express.static(__dirname));
var port = 10001;
server.listen(port, function() {
console.log(''listening on port '' + port);
//var err = new Error(''This error won''t break the application...'')
//throw err
});
Para el trabajo de desarrollo, puede utilizar (expreso 4) https://github.com/appsmatics/simple-httpserver.git
Para las personas que desean un servidor ejecutable desde el script NodeJS:
Puede usar expressjs/serve-static que reemplaza a connect.static
(que ya no está disponible a partir de connect 3):
myapp.js:
var http = require(''http'');
var finalhandler = require(''finalhandler'');
var serveStatic = require(''serve-static'');
var serve = serveStatic("./");
var server = http.createServer(function(req, res) {
var done = finalhandler(req, res);
serve(req, res, done);
});
server.listen(8000);
y luego desde la línea de comando:
-
$ npm install finalhandler serve-static
-
$ node myapp.js
Para un aumento saludable del rendimiento utilizando el nodo para servir recursos estáticos, recomiendo usar Buffet . Funciona de forma similar a un acelerador de aplicaciones web, también conocido como un proxy inverso HTTP de almacenamiento en caché, pero solo carga el directorio elegido en la memoria.
Buffet adopta un enfoque completamente almacenado en búfer: todos los archivos se cargan completamente en la memoria cuando se inicia la aplicación, por lo que nunca sentirá la quema del sistema de archivos. En la práctica, esto es inmensamente eficiente. ¡Tanto es así que poner Varnish frente a tu aplicación podría incluso hacerla más lenta!
Lo usamos en el sitio codePile y encontramos un aumento de ~ 700 solicitudes / seg a> 4k solicitudes / seg en una página que descarga 25 recursos bajo una carga de conexión de usuario concurrente de 1k.
Ejemplo:
var server = require(''http'').createServer();
var buffet = require(''buffet'')(root: ''./file'');
server.on(''request'', function (req, res) {
buffet(req, res, function () {
buffet.notFound(req, res);
});
});
server.listen(3000, function () {
console.log(''test server running on port 3000'');
});
Primero instale el servidor node-static a través de npm install node-static -g
-g es instalarlo globalmente en su sistema, luego navegue hasta el directorio donde se encuentran sus archivos, inicie el servidor con static
que escucha en el puerto 8080, navegue a la navegador y escriba localhost: 8080 / yourhtmlfilename.
Puede usar el paquete de link NPM para esto; si no necesita el material NodeJS, es una herramienta rápida y fácil de usar:
1 - Instala el paquete en tu PC:
npm install -g serve
2 - Servir su carpeta estática con serve <path>
:
d:> serve d:/StaticSite
Le mostrará a qué puerto se está sirviendo su carpeta estática, simplemente navegue hasta el host como:
http://localhost:3000
Puedes intentar serve-me
Usarlo es muy fácil:
ServeMe = require(''serve-me'')();
ServeMe.start(3000);
Eso es todo.
PD: La carpeta servida por defecto es "pública".
Sé que no es Node, pero he usado SimpleHTTPServer de Python:
python -m SimpleHTTPServer [port]
Funciona bien y viene con Python.
Si está interesado en un servidor http ultraligero sin ningún requisito previo, debería echar un vistazo a: mongoose
Si no desea utilizar la herramienta lista, puede usar el código a continuación, como lo demostré en https://developer.mozilla.org/en-US/docs/Node_server_without_framework :
var http = require(''http'');
var fs = require(''fs'');
var path = require(''path'');
http.createServer(function (request, response) {
console.log(''request starting...'');
var filePath = ''.'' + request.url;
if (filePath == ''./'')
filePath = ''./index.html'';
var extname = path.extname(filePath);
var contentType = ''text/html'';
switch (extname) {
case ''.js'':
contentType = ''text/javascript'';
break;
case ''.css'':
contentType = ''text/css'';
break;
case ''.json'':
contentType = ''application/json'';
break;
case ''.png'':
contentType = ''image/png'';
break;
case ''.jpg'':
contentType = ''image/jpg'';
break;
case ''.wav'':
contentType = ''audio/wav'';
break;
}
fs.readFile(filePath, function(error, content) {
if (error) {
if(error.code == ''ENOENT''){
fs.readFile(''./404.html'', function(error, content) {
response.writeHead(200, { ''Content-Type'': contentType });
response.end(content, ''utf-8'');
});
}
else {
response.writeHead(500);
response.end(''Sorry, check with the site admin for error: ''+error.code+'' ../n'');
response.end();
}
}
else {
response.writeHead(200, { ''Content-Type'': contentType });
response.end(content, ''utf-8'');
}
});
}).listen(8125);
console.log(''Server running at http://127.0.0.1:8125/'');
ACTUALIZACIÓN Si necesita acceder a su servidor desde un archivo / demanda externo, necesita superar el CORS, en su archivo node.js escribiendo lo siguiente, como mencioné en una respuesta anterior here
// Website you wish to allow to connect
response.setHeader(''Access-Control-Allow-Origin'', ''*'');
// Request methods you wish to allow
response.setHeader(''Access-Control-Allow-Methods'', ''GET, POST, OPTIONS, PUT, PATCH, DELETE'');
// Request headers you wish to allow
response.setHeader(''Access-Control-Allow-Headers'', ''X-Requested-With,content-type'');
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader(''Access-Control-Allow-Credentials'', true);
ACTUALIZAR
Como mencionó Adrian, en los comentarios, escribió un código ES6 con una explicación completa here , yo solo re-publico su código a continuación, en caso de que el código haya desaparecido del sitio original por alguna razón:
const http = require(''http'');
const url = require(''url'');
const fs = require(''fs'');
const path = require(''path'');
const port = process.argv[2] || 9000;
http.createServer(function (req, res) {
console.log(`${req.method} ${req.url}`);
// parse URL
const parsedUrl = url.parse(req.url);
// extract URL path
let pathname = `.${parsedUrl.pathname}`;
// based on the URL path, extract the file extention. e.g. .js, .doc, ...
const ext = path.parse(pathname).ext;
// maps file extention to MIME typere
const map = {
''.ico'': ''image/x-icon'',
''.html'': ''text/html'',
''.js'': ''text/javascript'',
''.json'': ''application/json'',
''.css'': ''text/css'',
''.png'': ''image/png'',
''.jpg'': ''image/jpeg'',
''.wav'': ''audio/wav'',
''.mp3'': ''audio/mpeg'',
''.svg'': ''image/svg+xml'',
''.pdf'': ''application/pdf'',
''.doc'': ''application/msword''
};
fs.exists(pathname, function (exist) {
if(!exist) {
// if the file is not found, return 404
res.statusCode = 404;
res.end(`File ${pathname} not found!`);
return;
}
// if is a directory search for index file matching the extention
if (fs.statSync(pathname).isDirectory()) pathname += ''/index'' + ext;
// read file from file system
fs.readFile(pathname, function(err, data){
if(err){
res.statusCode = 500;
res.end(`Error getting the file: ${err}.`);
} else {
// if the file is found, set Content-type and send data
res.setHeader(''Content-type'', map[ext] || ''text/plain'' );
res.end(data);
}
});
});
}).listen(parseInt(port));
console.log(`Server listening on port ${port}`);
Si utiliza el marco Express , esta funcionalidad viene lista para funcionar.
Para configurar una aplicación de servicio de archivos simple simplemente haga esto:
mkdir yourapp
cd yourapp
npm install express
node_modules/express/bin/express
También preguntó por qué caen las solicitudes; no está seguro de cuál es el motivo específico de su caso, pero en general es mejor que el servidor contenga contenido estático utilizando middleware dedicado (nginx, S3, CDN) porque Node realmente no está optimizado para este patrón de red. Vea una explicación más detallada aquí (punto 13): http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/
Todavía no está en NPM, pero construí un servidor estático simple en Express que también te permite aceptar envíos de formularios y enviarlos por correo electrónico a través de un servicio de correo electrónico transaccional (Sendgrid por ahora, Mandrill viene).
Un simple servidor estático utilizando connect
var connect = require(''connect''),
directory = __dirname,
port = 3000;
connect()
.use(connect.logger(''dev''))
.use(connect.static(directory))
.listen(port);
console.log(''Listening on port '' + port);
Véase también Usar node.js como un servidor web simple
Una buena opción de "herramienta lista para usar" podría ser http-server:
npm install http-server -g
Para usarlo:
cd D:/Folder
http-server
O así:
http-server D:/Folder
Échale un vistazo: https://github.com/nodeapps/http-server
Uso Houston en el trabajo y para proyectos personales, funciona bien para mí.
Aquí está mi proyecto de mascota de servidor web con un archivo / lightweight node.js sin ninguna dependencia que creo que es una herramienta rápida y enriquecida que es tan fácil de usar como ejecutar este comando en su terminal Linux / Unix / macOS ( o termux en Android) cuando se instala node.js (o nodejs-legacy
en Debian / Ubuntu):
curl pad.js.org | node
(existen diferentes comandos para usuarios de Windows en la documentación)
Es compatible con diferentes cosas que creo que pueden ser útiles,
- Creación / servicio de índice de directorio jerárquico
- Con capacidad de clasificación en los diferentes criterios.
- La carga desde el navegador mediante la función de arrastrar y soltar [múltiples archivos] y la copia y pegado de archivos / texto y el clip del sistema en Chrome, Firefox y otros navegadores puede tener algunas limitaciones (que pueden desactivarse desde la línea de comandos opciones que proporciona)
- Carpeta / creación de notas / botón subir
- Sirviendo MIME correctos para tipos de archivos conocidos (con posibilidad de deshabilitar eso)
- Posibilidad de instalación como paquete npm y herramienta local o instalación unineal como servicio permanente con Docker
- Servicio de archivos HTTP 206 (transferencia de archivos de varias partes) para transferencias más rápidas
- Cargas desde el terminal y la consola del navegador (de hecho, originalmente fue pensado como un proxy del sistema de archivos para la consola JS de los navegadores en otras páginas / dominios)
- Descargas / subidas de CORS (que también se pueden desactivar)
- Fácil integración con HTTPS
- Opciones de línea de comando ligeras para lograr un servicio mejor y seguro con él:
- Con mi parche en node.js 8 , puede tener acceso a las opciones sin la primera instalación:
curl pad.js.org | node - -h
curl pad.js.org | node - -h
- O primero instálelo como un paquete npm global del sistema mediante
[sudo] npm install -g pad.js
y luego use su versión instalada para tener acceso a sus opciones:pad -h
- O use la imagen Docker provista que usa opciones relativamente seguras por defecto.
[sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js
- Con mi parche en node.js 8 , puede tener acceso a las opciones sin la primera instalación:
La mayoría de las funciones descritas anteriormente están documentadas en la página principal de la herramienta http://pad.js.org, que mediante un buen truco que usé también es el lugar desde el que se proporciona la fuente de la herramienta.
La fuente de la herramienta está en GitHub que agradece sus comentarios, solicitudes de funciones y s!
connect podría ser lo que estás buscando.
Se instala fácilmente con:
npm install connect
Entonces el servidor de archivos estáticos más básico podría escribirse como:
var connect = require(''connect''),
directory = ''/path/to/Folder'';
connect()
.use(connect.static(directory))
.listen(80);
console.log(''Listening on port 80.'');
const http = require(''http'');
const fs = require(''fs'');
const url = require(''url'');
const path = require(''path'');
let mimeTypes = {
''.html'': ''text/html'',
''.css'': ''text/css'',
''.js'': ''text/javascript'',
''.jpg'': ''image/jpeg'',
''.png'': ''image/png'',
''.ico'': ''image/x-icon'',
''.svg'': ''image/svg+xml'',
''.eot'': ''appliaction/vnd.ms-fontobject'',
''.ttf'': ''aplication/font-sfnt''
};
http.createServer(function (request, response) {
let pathName = url.parse(request.url).path;
if(pathName === ''/''){
pathName = ''/index.html'';
}
pathName = pathName.substring(1, pathName.length);
let extName = path.extName(pathName);
let staticFiles = `${__dirname}/template/${pathName}`;
if(extName ==''.jpg'' || extName == ''.png'' || extName == ''.ico'' || extName == ''.eot'' || extName == ''.ttf'' || extName == ''.svg'')
{
let file = fr.readFileSync(staticFiles);
res.writeHead(200, {''Content-Type'': mimeTypes[extname]});
res.write(file, ''binary'');
res.end();
}else {
fs.readFile(staticFiles, ''utf8'', function (err, data) {
if(!err){
res.writeHead(200, {''Content-Type'': mimeTypes[extname]});
res.end(data);
}else {
res.writeHead(404, {''Content-Type'': ''text/html;charset=utf8''});
res.write(`<strong>${staticFiles}</strong>File is not found.`);
}
res.end();
});
}
}).listen(8081);