2012-08-15 13 views
12

Al enviar secuencias de comandos desde mi servidor Node.js al navegador, en Google Chrome, me sale esta advertencia:¿Cómo configuro un tipo MIME antes de enviar un archivo en Node.js?

Recursos interpretarse como guión, pero transferidos con el tipo MIME text/plain

I Google dio la vuelta y descubrió que se trata de un problema del lado del servidor, es decir, creo que debo establecer el tipo MIME correcto para las cosas, antes de enviarlas. Aquí está manejador del servidor HTTP:

var handler = function(req, res) 
{ 
    url = convertURL(req.url); //I implemented "virtual directories", ignore this. 

    if (okURL(url)) //If it isn't forbidden (e.g. forbidden/passwd.txt) 
    { 
     fs.readFile (url, function(err, data) 
     { 
      if (err) 
      { 
       res.writeHead(404); 
       return res.end("File not found."); 
      } 

      //I think that I need something here. 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } 
    else //The user is requesting an out-of-bounds file. 
    { 
     res.writeHead(403); 
     return res.end("Forbidden."); 
    } 
} 

Pregunta: ¿Cómo puedo corregir mi código del lado del servidor para configurar el tipo MIME correctamente?

(Nota: Ya encontró https://github.com/broofa/node-mime, pero sólo me permite determinar el tipo MIME, no para "fijar" la misma.)

Respuesta

15

lo he descubierto!

Gracias a @ rdrey de link y this node module I logrado establecer correctamente el tipo MIME de la respuesta, de esta manera:

function handler(req, res) { 
    var url = convertURL(req.url); 

    if (okURL(url)) { 
     fs.readFile(url, function(err, data) { 
      if (err) { 
       res.writeHead(404); 
       return res.end("File not found."); 
      } 

      res.setHeader("Content-Type", mime.lookup(url)); //Solution! 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } else { 
     res.writeHead(403); 
     return res.end("Forbidden."); 
    } 
} 
6

búsqueda en Google de la cabecera HTTP Content-Type.

luego averiguar cómo configurarlo con http://expressjs.com/api.html#res.set

Vaya, el ejemplo incluye su respuesta;)

simplemente marque el archivo que termina, si es .js, establecer el tipo MIME adecuado para hacer felices a los navegadores.

EDIT: En caso de que este es el nodo puro, sin expreso, mira aquí: http://nodejs.org/api/http.html#http_response_setheader_name_value

+0

Sí, nodo puro, no Express. – corazza

+1

OK, la única pieza faltante es que descubra el tipo de scripts MIME, que aparece en el encabezado correcto para cada respuesta. – rdrey

+0

Hecho eso, ver mi respuesta. :) – corazza

0

tuve problemas utilizando la función de controlador porque convertURL y funciones okURL que no se definen. He modificado el código un poco y terminó con este aspecto

function handler(req, res) 
{ 
    // /home/juan/Documentos/push-api-demo is the path of the root directory of the server 
    var url    = '/home/juan/Documentos/push-api-demo' + req.url; 
    var file_exists  = fs.existsSync(url); 

    if (file_exists) 
    { 
     fs.readFile(url, function(err, data) 
     { 
      if (err) 
      { 
       res.writeHead(404); 
       return res.end("File not found."); 
      } 

      res.setHeader("Content-Type", mime.lookup(url)); 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } 
    else 
    { 
     res.writeHead(403); 
     return res.end("Forbidden."); 
    } 
} 
0

mime.lookup() se renombra como mime.getType(). Para que pueda hacer esto:

res.set('Content-Type', mime.getType('path/file')); 
Cuestiones relacionadas