2012-02-05 15 views
9

Siguiendo con: The Node Beginner Booknodejs y errores de cabecera formidable

soy incapaz de depurar este problema o encontrar una solución en línea. Un novato en Node.js, esperando que alguien puede ofrecer una solución

ERROR: Se ha actualizado con la información de registro de la consola sábado por la, 11 de febrero de, 2012 07:27:17 AM

Request for/ received! 
About to route a request for/
Request handler 'start' was called. 
Request for/favicon.ico received! 
About to route a request for /favicon.ico 
No request handler found for /favicon.ico 
Request for/favicon.ico received! 
About to route a request for /favicon.ico 
No request handler found for /favicon.ico 
Request for/upload received! 
About to route a request for /upload 
Request handler 'upload' was called. 
about to parse 
{ output: [], 
    outputEncodings: [], 
    writable: true, 
    _last: false, 
    chunkedEncoding: false, 
    shouldKeepAlive: true, 
    useChunkedEncodingByDefault: true, 
    _hasBody: true, 
    _trailer: '', 
    finished: false, 
    socket: 
    { _handle: 
     { writeQueueSize: 0, 
     socket: [Circular], 
     onread: [Function: onread] }, 
    _pendingWriteReqs: 0, 
    _flags: 0, 
    _connectQueueSize: 0, 
    destroyed: false, 
    bytesRead: 66509, 
    bytesWritten: 638, 
    allowHalfOpen: true, 
    writable: true, 
    readable: true, 
    server: 
     { connections: 1, 
     allowHalfOpen: true, 
     _handle: [Object], 
     _events: [Object], 
     httpAllowHalfOpen: false }, 
    ondrain: [Function], 
    _idleTimeout: 120000, 
    _idleNext: 
     { _idleNext: [Circular], 
     _idlePrev: [Circular], 
     ontimeout: [Function] }, 
    _idlePrev: 
     { _idleNext: [Circular], 
     _idlePrev: [Circular], 
     ontimeout: [Function] }, 
    _idleStart: Sat, 11 Feb 2012 15:25:28 GMT, 
    _events: { timeout: [Function], error: [Function], close: [Object] }, 
    ondata: [Function], 
    onend: [Function], 
    _httpMessage: [Circular] }, 
    connection: 
    { _handle: 
     { writeQueueSize: 0, 
     socket: [Circular], 
     onread: [Function: onread] }, 
    _pendingWriteReqs: 0, 
    _flags: 0, 
    _connectQueueSize: 0, 
    destroyed: false, 
    bytesRead: 66509, 
    bytesWritten: 638, 
    allowHalfOpen: true, 
    writable: true, 
    readable: true, 
    server: 
     { connections: 1, 
     allowHalfOpen: true, 
     _handle: [Object], 
     _events: [Object], 
     httpAllowHalfOpen: false }, 
    ondrain: [Function], 
    _idleTimeout: 120000, 
    _idleNext: 
     { _idleNext: [Circular], 
     _idlePrev: [Circular], 
     ontimeout: [Function] }, 
    _idlePrev: 
     { _idleNext: [Circular], 
     _idlePrev: [Circular], 
     ontimeout: [Function] }, 
    _idleStart: Sat, 11 Feb 2012 15:25:28 GMT, 
    _events: { timeout: [Function], error: [Function], close: [Object] }, 
    ondata: [Function], 
    onend: [Function], 
    _httpMessage: [Circular] }, 
    _events: { finish: [Function] } } 

/usr/local/lib/node_modules/formidable/lib/incoming_form.js:247 

undefined 
    if (this.headers['content-length']) { 
       ^

TypeError: Cannot read property 'content-length' of undefined 
    at IncomingForm._parseContentLength (/usr/local/lib/node_modules/formidable/lib/incoming_form.js:247:19) 
    at IncomingForm.writeHeaders (/usr/local/lib/node_modules/formidable/lib/incoming_form.js:126:8) 
    at IncomingForm.parse (/usr/local/lib/node_modules/formidable/lib/incoming_form.js:80:8) 
    at Object.upload [as /upload] (/Applications/MAMP/htdocs3/js/nodejs/webapp/requestHandlers.js:34:8) 
    at route (/Applications/MAMP/htdocs3/js/nodejs/webapp/router.js:4:20) 
    at Server.onRequest (/Applications/MAMP/htdocs3/js/nodejs/webapp/server.js:20:3) 
    at Server.emit (events.js:70:17) 
    at HTTPParser.onIncoming (http.js:1511:12) 
    at HTTPParser.onHeadersComplete (http.js:102:31) 
    at Socket.ondata (http.js:1407:22) 

Error de final

requestHandlers.js

var querystring = require("querystring"), 
    fs = require("fs"), 
    formidable = require("formidable"); 

function start(response) { 
    console.log("Request handler 'start' was called."); 

    var body = '<html>'+ 
    '<head>'+ 
    '<meta http-equiv="Content-Type" '+ 
    'content="text/html; charset=UTF-8" />'+ 
    '</head>'+ 
    '<body>'+ 
    '<form action="/upload" enctype="multipart/form-data" '+ 
    'method="post">'+ 
    '<input type="file" name="upload" multiple="multiple">'+ 
    '<input type="submit" value="Upload file" />'+ 
    '</form>'+ 
    '</body>'+ 
    '</html>'; 

    response.writeHead(200, {"Content-Type": "text/html"}); 
    response.write(body); 
    response.end(); 
} 

function upload(response, request) { 
    console.log("Request handler 'upload' was called."); 

    var form = new formidable.IncomingForm(); 
    console.log("about to parse"); 
    form.parse(request, function(error, fields, files) { 
    console.log("parsing done"); 

    /* 
    * Some systems [Windows] raise an error when you attempt to rename new file into one that already exists. 
    * This call deletes the previous .PNG image prior to renaming the new one in its place. 
    */ 
    fs.unlinkSync(__dirname +"/tmp/test.jpg"); 
    fs.renameSync(files.upload.path, "/tmp/test.jpg"); 
    response.writeHead(200, {"Content-Type": "text/html"}); 
    response.write("received image:<br/>"); 
    response.write("<img src='/show' />"); 
    response.end(); 
    }); 
} 

function show(response) { 
    console.log("Request handler 'show' was called."); 
    fs.readFile(__dirname + "/tmp/test.jpg", "binary", function(error, file) { 
    if(error) { 
     response.writeHead(500, {"Content-Type": "text/plain"}); 
     response.write(error + "\n"); 
     response.end(); 
    } else { 
     response.writeHead(200, {"Content-Type": "image/jpg"}); 
     response.write(file, "binary"); 
     response.end(); 
    } 
    }); 
} 

exports.start = start; 
exports.upload = upload; 
exports.show = show; 

index.js

var server = require("./server"); 
var router = require("./router"); 
var requestHandlers = require("./requestHandlers"); 

var handle = {} 
handle["/"] = requestHandlers.start; 
handle["/start"] = requestHandlers.start; 
handle["/upload"] = requestHandlers.upload; 
handle["/show"] = requestHandlers.show; 

server.start(router.route, handle); 

router.js

function route(handle, pathname, response, request) { 
    console.log("About to route a request for " + pathname); 
    if (typeof handle[pathname] === 'function') { 
    handle[pathname](response, request); 
    } else { 
    console.log("No request handler found for " + pathname); 
    response.writeHead(404, {"Content-Type": "text/html"}); 
    response.write("404 Not found"); 
    response.end(); 
    } 
} 

exports.route = route; 

server.js

var http = require("http"); 
var url = require("url"); 

function start(route, handle) { 
    function onRequest(request, response) { 
    var pathname = url.parse(request.url).pathname; 
    console.log("Request for " + pathname + " received."); 
    route(handle, pathname, response, request); 
    } 

    // http.createServer(onRequest).listen(8888); 
    // console.log("Server has started."); 
    http.createServer(onRequest).listen(1337, "127.0.0.1"); 
    console.log('Server Has Started!'); 
} 

exports.start = start; 
+1

Creo que nos estamos perdiendo la parte importante. ¿Cómo llamas a todas estas funciones? – loganfsmyth

+1

Incluido todo el código. Gracias por la respuesta. – Wasabi

+0

¿No debería usar la respuesta en lugar de la solicitud? Entonces debe ser form.parse (response, function (... en una función de carga. Inténtalo y avísame. Además, solicita/responde antes de form.parse() escribiendo en console.log (response)/console .log (solicitud) –

Respuesta

0

Por lo que vale la pena el código anterior trabajó para mí.

Parece que el problema es formidable. Comprobando el paquete.json en node_modules Estoy usando la versión 1.0.8 en node -v = v0.4.12.

Parece que el navegador o la solicitud que está realizando no incluye un encabezado de longitud de contenido en la solicitud. Estaba usando Chrome, pero si usaba CURL o tal vez realizaba la solicitud de forma asíncrona o como una secuencia, es posible que no tenga un encabezado de longitud de contenido en la solicitud que causa este problema. Esto es algo discutido aquí: https://github.com/felixge/node-formidable/issues/93

En mi opinión, formidable debe verificar la existencia del parámetro correctamente (typeof(this.headers['content-length']) != undefined). Sería ayudar a los demás si se identifica el navegador y el tipo de archivo que estaba tratando de subir, entonces se podría informar de un problema más en https://github.com/felixge/node-formidable/

Nota: es posible que también actualizar el título de esta pregunta a nodejs no nodjs. Buena suerte con el nodo!

0

Si usa las mismas versiones de Formidable y Node.js que las que se usan en el tutorial, el código funciona según lo anunciado.

La versión de Formidable utilizada en el tutorial es 1.0.2. Para obtener esta versión, emita:

$ sudo npm install [email protected] 

La versión de Node.js es 0.6.10, que se puede encontrar aquí: https://github.com/joyent/node/tags

2

No hay necesidad de utilizar versiones antiguas de nodo y formidable. Pude obtener el ejemplo para trabajar con Node v0.10.20 y Formidable v1.0.14. Parece que la propiedad files.upload ya no se utiliza.

basta con cambiar esta línea siguiente del libro:

fs.rename(files.upload.path, "/tmp/test.png", function(error) { ... }); 

a

fs.rename(files.file.path, "/tmp/test.png", function(error) { ... }); 

... y luego la carga funciona a la perfección!


Otro pellizco opcional al ejemplo (especialmente para los desarrolladores de Windows)

En lugar de utilizar el estado de error de fs.rename() para determinar si el archivo ya existe, tuve una gran suerte usando fs.exists() hacer cheque para el archivo existente que parecía menos de un truco. También he guardado el archivo prueba.png en el directorio local, ya que /tmp es un camino bastante poco natural de Windows ...

var img = "./test.png"; 

... 

    fs.exists(img, function(exists){ 
     if(exists){ fs.unlink(img); } 

     fs.rename(files.file.path, img); 

     ... 
0

Bueno, yo tienen el mismo código que usted, pero con un pequeño cambio en la función de carga en RequestHandlers Js, trate de cambiar esto:

function upload(response, request) { 
... 
var form = new formidable.IncomingForm(); 
... 
} 

a esto:

function upload(response, request){ 
... 
var form = new formidable.IncomingForm(), files = [], fields = []; 
... 
} 

Si eso no funciona, usted debería ser capaz de ver cómo es la solicitud h eader formando:

function upload(response, request){ 
... 
form.parse(request, function(error, fields,files){ 
console.dir(request.headers); 
... 
} 
} 

Esperanza a resolver su problema