2012-02-05 2 views
9

После вместе с: The Node Beginner Booknodejs и грозный ошибок заголовка

Я не могу отладить этот вопрос или найти решение в Интернете. Новичок в Node.js, надеясь кто-то может предложить решение

ОШИБКА: обновление с лог консоли информацию в субботу, 11 февраля, 2012 7: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) 

End Error

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

Я думаю, что мы упускаем важную роль. Как вы называете все эти функции? – loganfsmyth

+1

Включен весь код. Спасибо за ответ. – Wasabi

+0

Не следует ли использовать ответ вместо запроса? Таким образом, это должно быть form.parse (response, function (... в функции загрузки). Попробуйте и дайте мне знать. Кроме того, отладочный запрос/ответ перед формой.parse(), введя в console.log (response)/console .log (запрос) –

ответ

0

За то, что он стоит выше код работает для меня.

Проблема, кажется, происходит в пределах грозного. Проверка package.json в node_modules Я использую версию 1.0.8 на node -v = v0.4.12.

Похоже, что браузер или запрос, который вы делаете, не включают заголовок длины содержимого в запросе. Я использовал Chrome, но если вы используете CURL или, возможно, выполняете запрос асинхронно или как поток, у вас может не быть заголовка длины содержимого в запросе, вызывающем эту проблему. Это несколько обсуждается здесь: https://github.com/felixge/node-formidable/issues/93

На мой взгляд, грозный должен правильно проверить наличие параметра (typeof(this.headers['content-length']) != undefined). Это помогло бы другим, если вы определить ваш браузер и тип файла, который вы пытались загрузить, то вы можете сообщить об ошибке в течение https://github.com/felixge/node-formidable/

Примечание: Вы можете также обновить название этого вопроса до nodejs не nodjs. Удачи с узлом!

0

Если вы используете те же версии Formidable и Node.js, которые используются в учебнике, код работает так, как рекламируется.

Версия Исследуемая, используемая в учебнике: 1.0.2. Для получения этой версии, вопроса:

$ sudo npm install [email protected] 

Версия Node.js является 0.6.10, который можно найти здесь: https://github.com/joyent/node/tags

2

Нет необходимости использовать старые версии узла и Грозного. Я смог привести пример для работы с Node v0.10.20 и Formidable v1.0.14. Похоже, что свойство files.upload больше не используется.

Просто изменить следующую строку из книги:

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

в

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

... а затем загрузка работает отлично!


Другая необязательная подстройка к примеру (особенно для разработчиков Windows)

Вместо того чтобы использовать статус ошибки из fs.rename(), чтобы определить, если файл уже существует, я имел большую удачу, используя fs.exists() сделать проверку для существующего файла, который считался менее взломанным. Я также сохранил файл test.png в локальный каталог, так как /tmp является довольно неестественным путем для Windows ...

var img = "./test.png"; 

... 

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

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

     ... 
0

Ну у меня есть один и тот же код, который вы, но с небольшим изменением загрузки функции на RequestHandlers .js, попробовать это изменить:

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

к этому:

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

Если это не работает, вы должны быть в состоянии видеть, как это требование ч eader формирования:

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

Надеюсь решить вашу проблему

Смежные вопросы