Enviando todo el contenido de la carpeta al cliente con Express.

Hice un juego html5 (usando GameMaker), que está constituido por un index.html y una carpeta “html5game” que contiene las dependencias del juego: el código javascript y los recursos. El problema es que los recursos son bastante numerosos y diversos (sonidos, sprites, etc.) y el cliente los necesita para jugar.

Estoy buscando una manera de enviarlos a todos sin nombrarlos específicamente.

Probé el módulo glob:

var glob = require( 'glob' ); var files = glob.sync( './html5game/**' ).forEach( function( file ) { require( path.resolve( file ) ); }); 

pero no puedo encontrar una manera de enviar los archivos usando res.sendFile () una vez que lo hice.

Lo intenté

 var express = require('express'); var app = express(); [...] app.get('/aeronavale/jeu', function(req, res){ res.sendFile(__dirname + '/aeronavale/index.html'); res.sendFile(files) }); [...] app.listen(3000, function(){ console.log('app started on port 3000, yeah !') }) 

pero me da el error:

 TypeError: path argument is required to res.sendFile 

Si tienes otra solución, también me interesa. Gracias por tus respuestas !

No podrá enviar varios archivos así con res.sendFile . Lo más sencillo que puedes hacer aquí sería esto:

Coloque su archivo index.html y su directorio html5game en algún directorio común, por ejemplo, llamado html y html5game donde tenga su progtwig Node.js. Un ejemplo de diseño de directorio sería:

 /home/you/yourapp: - app.js (your node program) - package.json (your package.json etc) - html (a new directory) - index.html (your main html to serve) - html5game (the directory with other files) - (other files) 

Ahora, en tu progtwig Node puedes usar algo como esto:

 var path = require('path'); var express = require('express'); var app = express(); var htmlPath = path.join(__dirname, 'html'); app.use(express.static(htmlPath)); var server = app.listen(3000, function () { var host = 'localhost'; var port = server.address().port; console.log('listening on http://'+host+':'+port+'/'); }); 

Esto servirá a todos sus archivos (incluido index.html ) en direcciones como:

  • http: // localhost: 3000 / (su index.html )
  • http: // localhost: 3000 / html5game / xxx.js (sus activos)

Por supuesto, todavía debe asegurarse de que hace referencia a sus activos en su archivo index.html correctamente, por ejemplo con:

  

en el caso del ejemplo de diseño anterior.

El directorio de nivel superior con sus activos estáticos (donde tiene su index.html ) generalmente se llama static , public o html pero puede llamarlo como desee, siempre que use la ruta correcta en su llamada a express.static() .

Si desea que su juego esté disponible en otra ruta que no sea la ruta raíz, puede especificarlo para app.use . Por ejemplo si cambias esto:

 app.use(express.static(htmlPath)); 

a esto:

 app.use('/game', express.static(htmlPath)); 

Entonces en lugar de esas URLs:

  • http: // localhost: 3000 / (su index.html )
  • http: // localhost: 3000 / html5game / xxx.js (sus activos)

esas URLs estarán disponibles en su lugar:

  • http: // localhost: 3000 / game / (su index.html )
  • http: // localhost: 3000 / game / html5game / xxx.js (sus activos)

Muchas preguntas aquí están relacionadas con el servicio de archivos estáticos con Express, de modo que hice un ejemplo práctico y lo publiqué en GitHub para que las personas puedan tener un punto de partida e ir desde allí:

Vea también algunas otras respuestas donde hablo sobre esto con más detalle:

  • Cómo servir una imagen usando nodejs
  • Error al cargar el recurso desde el mismo directorio al redireccionar Javascript
  • La llamada js onload no funciona con nodo
  • La carga de parciales falla en el servidor JS
  • Nodo JS no sirve la imagen estática