nodejs&强大的头部错误

以下内容: 节点初学者书

我无法debugging此问题或在线查找解决scheme。 Node.js的新手,希望有人能提供一个解决scheme

错误:更新与控制台日志信息2012年2月11日星期六上午7时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) 

结束错误

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; 

不需要使用旧版本的Node和Formidable。 我能够得到这个例子与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是一个相当不自然的Windowspath…

 var img = "./test.png"; ... fs.exists(img, function(exists){ if(exists){ fs.unlink(img); } fs.rename(files.file.path, img); ... 

上面的代码对我来说是值得的。

这个问题似乎在可怕的范围内发生。 检查node_modules中的package.json我在node -v = v0.4.12上使用版本1.0.8。

看来您所做的浏览器或请求在请求中不包含内容长度标题。 我使用的是Chrome,但是如果您使用CURL或者可能asynchronous或者以stream的forms发送请求,则请求中可能没有内容长度标题,从而导致此问题。 这在这里有点讨论: https : //github.com/felixge/node-formidable/issues/93

在我看来,强大的应该检查参数的存在是否正确( typeof(this.headers['content-length']) != undefined )。 如果你确定你的浏览器和你正在上传的文件的types,它会帮助其他人,然后你可以通过https://github.com/felixge/node-formidable/

注意:你也可以把这个问题的标题更新为nodejs而不是nodjs 。 祝你好运!

如果您使用教程中使用的相同版本的Formidable和Node.js,则代码将按照所宣传的方式工作。

本教程中使用的Formidable版本是1.0.2 。 要获得此版本,请发出:

 $ sudo npm install formidable@1.0.2 

Node.js的版本是0.6.10 ,可以在这里find: https : //github.com/joyent/node/tags

那么我有和你一样的代码,但是在RequestHandlers.js的函数上传中有一点改变,试着改变它:

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

对此:

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

如果这不起作用,你应该能够看到请求头是如何形成的:

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

希望你解决你的问题