2012-02-05 26 views
9

stosując się: The Node Beginner Booknodejs i groźny błąd nagłówka

jestem niezdolny do debugowania tego problemu lub znaleźć rozwiązanie w Internecie. Newbie do node.js, mając nadzieję, że ktoś może zaoferować rozwiązanie

BŁĄD: Aktualizacja z informacji dziennika konsola sobota, 11 lutego 2012 07:27:17

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) 

End Błąd

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

Myślę, że brakuje ważną rolę. Jak wywołujesz wszystkie te funkcje? – loganfsmyth

+1

Zawarte cały kod. Dziękuję za odpowiedź. – Wasabi

+0

Nie należy używać odpowiedzi zamiast żądania? Tak więc powinno to być form.parse (odpowiedź, funkcja (... w funkcji przesyłania.) Wypróbuj i daj mi znać.Dodatkowo debuguj żądanie/odpowiedź przed form.parse() wpisując w console.log (response)/console .log (request) –

Odpowiedz

0

Na co warto powyższy kod pracował dla mnie.

Problem zdaje się występować w obrębie groźnego. Sprawdzanie package.json w module node_modules Używam wersji 1.0.8 na node -v = v0.4.12.

Wygląda na to, że przeglądarka lub żądanie, które tworzysz, nie zawiera nagłówka długości treści w żądaniu. Używałem przeglądarki Chrome, ale jeśli używasz CURL lub może to żądanie asynchronicznie lub strumieniowo, możesz nie mieć nagłówka długości treści w żądaniu powodującego ten problem. Jest to nieco omówione tutaj: https://github.com/felixge/node-formidable/issues/93

Moim zdaniem, groźny powinien sprawdzić istnienie parametru prawidłowo (typeof(this.headers['content-length']) != undefined). Byłoby pomóc innym, jeśli zidentyfikować przeglądarkę i typ pliku, który próbujesz przesłać, a następnie można zgłosić błąd na co https://github.com/felixge/node-formidable/

Uwaga: można także zaktualizować tytuł to pytanie do nodejs nie nodjs. Powodzenia z węzłem!

0

Jeśli używasz tych samych wersji Formidable i Node.js, jak użyto w samouczku, kod działa tak, jak jest reklamowany.

Wersja Formidable użyta w samouczku to 1.0.2. Aby uzyskać tę wersję, problem:

$ sudo npm install [email protected] 

Wersja node.js jest 0.6.10, które można znaleźć tutaj: https://github.com/joyent/node/tags

2

Nie trzeba używać starych wersji węzeł i ogromne. Byłem w stanie uzyskać przykład do pracy z Node v0.10.20 i Formidable v1.0.14. Wygląda na to, że właściwość files.upload nie jest już używana.

Wystarczy zmienić następujący wiersz z książki:

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

do

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

... a następnie przesyłanie działa idealnie!


Inna opcja uszczypnąć do przykładu (szczególnie dla programistów Windows)

zamiast używać status błędu z fs.rename() aby określić, czy plik już istnieje, miałem wielkie szczęście, używając fs.exists() zrobić czek dla istniejącego pliku, który wydawał się mniej hackowy. Ja również zapisany plik test.png do katalogu lokalnego, ponieważ /tmp jest dość nienaturalne ścieżka Okna ...

var img = "./test.png"; 

... 

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

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

     ... 
0

Cóż mam ten sam kod, który ty, ale z niewielką zmianą funkcji przesyłania na RequestHandlers js, spróbować zmienić to:

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

do tego:

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

Jeśli to nie zadziała powinieneś być w stanie zobaczyć, jak to żądanie h eader formowania:

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

Mam nadzieję, że rozwiąże problem