回复 (57)
好文!! 一个request就够研究的啦。 Server running at http://127.0.0.1:8124/ { socket: { _handle: { writeQueueSize: 0, socket: [Circular], onread: [Function: onread] }, _pendingWriteReqs: 2, _flags: 0, _connectQueueSize: 0, destroyed: false, bytesRead: 470, bytesWritten: 137, allowHalfOpen: true, writable: true, readable: true, server: { connections: 2, allowHalfOpen: true, _handle: [Object], _events: [Object], httpAllowHalfOpen: false }, ondrain: [Function], _idleTimeout: 120000, _idleNext: { _handle: [Object], _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroyed: false, bytesRead: 0, bytesWritten: 0, allowHalfOpen: true, writable: true, readable: true, server: [Object], ondrain: [Function], _idleTimeout: 120000, _idleNext: [Object], _idlePrev: [Circular], _idleStart: Thu, 15 Dec 2011 05:34:11 GMT, _events: [Object], ondata: [Function], onend: [Function] }, _idlePrev: { _idleNext: [Circular], _idlePrev: [Object], ontimeout: [Function] }, _idleStart: Thu, 15 Dec 2011 05:34:11 GMT, _events: { timeout: [Function], error: [Function], close: [Function] }, ondata: [Function], onend: [Function], _httpMessage: null }, connection: { _handle: { writeQueueSize: 0, socket: [Circular], onread: [Function: onread] }, _pendingWriteReqs: 2, _flags: 0, _connectQueueSize: 0, destroyed: false, bytesRead: 470, bytesWritten: 137, allowHalfOpen: true, writable: true, readable: true, server: { connections: 2, allowHalfOpen: true, _handle: [Object], _events: [Object], httpAllowHalfOpen: false }, ondrain: [Function], _idleTimeout: 120000, _idleNext: { _handle: [Object], _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroyed: false, bytesRead: 0, bytesWritten: 0, allowHalfOpen: true, writable: true, readable: true, server: [Object], ondrain: [Function], _idleTimeout: 120000, _idleNext: [Object], _idlePrev: [Circular], _idleStart: Thu, 15 Dec 2011 05:34:11 GMT, _events: [Object], ondata: [Function], onend: [Function] }, _idlePrev: { _idleNext: [Circular], _idlePrev: [Object], ontimeout: [Function] }, _idleStart: Thu, 15 Dec 2011 05:34:11 GMT, _events: { timeout: [Function], error: [Function], close: [Function] }, ondata: [Function], onend: [Function], _httpMessage: null }, httpVersion: '1.1', complete: false, headers: { host: '127.0.0.1:8124', connection: 'keep-alive', 'cache-control': 'max-age=0', 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, lik Gecko) Chrome/15.0.874.121 Safari/535.2', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8' 'accept-encoding': 'gzip,deflate,sdch', 'accept-language': 'zh-CN,zh;q=0.8', 'accept-charset': 'GBK,utf-8;q=0.7,*;q=0.3' }, trailers: {}, readable: true, url: '/sdfsdf/sdfsdfs/fsfsds/fsdfds/fsdfsd/fsdfsdf/fsdfs/fsfds?sdfds=fsdfsd& dsf=fsdfs2324', method: 'GET', statusCode: null, client: { _handle: { writeQueueSize: 0, socket: [Circular], onread: [Function: onread] }, _pendingWriteReqs: 2, _flags: 0, _connectQueueSize: 0, destroyed: false, bytesRead: 470, bytesWritten: 137, allowHalfOpen: true, writable: true, readable: true, server: { connections: 2, allowHalfOpen: true, _handle: [Object], _events: [Object], httpAllowHalfOpen: false }, ondrain: [Function], _idleTimeout: 120000, _idleNext: { _handle: [Object], _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroyed: false, bytesRead: 0, bytesWritten: 0, allowHalfOpen: true, writable: true, readable: true, server: [Object], ondrain: [Function], _idleTimeout: 120000, _idleNext: [Object], _idlePrev: [Circular], _idleStart: Thu, 15 Dec 2011 05:34:11 GMT, _events: [Object], ondata: [Function], onend: [Function] }, _idlePrev: { _idleNext: [Circular], _idlePrev: [Object], ontimeout: [Function] }, _idleStart: Thu, 15 Dec 2011 05:34:11 GMT, _events: { timeout: [Function], error: [Function], close: [Function] }, ondata: [Function], onend: [Function], _httpMessage: null }, httpVersionMajor: 1, httpVersionMinor: 1, upgrade: false }
赞!
写的真好,由浅入深,很清晰,让人了解每部分代码是怎么从构造出来,添加进去的
赞,非常值得学习!
[...] 本文转载自CNode社区田永强的文章。 [...]
[...] 嗯,在写完几个简单的控制器和模板之后,我没有往m层走,而是转向去完成一个node版本的静态服务器,通过朴灵同学的这篇文章可以简单了解实现技术,我就不多说了。。最开始我实现的和他差不多,看过他的之后觉得他的那种方法更好。貌似是从来外的书上翻译来的……?看看你就知道了。http://cnodejs.org/blog/?p=3904 [...]
[...] 嗯,在写完几个简单的控制器和模板之后,我没有往m层走,而是转向去完成一个node版本的静态服务器,通过朴灵同学的这篇文章可以简单了解实现技术,我就不多说了。。最开始我实现的和他差不多,看过他的之后觉得他的那种方法更好。貌似是从来外的书上翻译来的……?看看你就知道了。http://cnodejs.org/blog/?p=3904 [...]
[...] 推荐一篇本技术的好文章: 用NodeJS打造你的静态文件服务器 发表评论 | Trackback [...]
使用"child_process"模块的exec: function start(response) { console.log("Request handler 'start' was called."); exec("netstat -a",{ encoding: 'utf8',timeout: 60000 }, function (error, stdout, stderr) { response.writeHead(200, {'Content-Type': 'text/plain;charset=UTF-8'}); response.write(stdout); response.end(); }); } 中文显示是乱码,请教你啊,是什么原因呢?
在浏览器中response中文显示乱码如何解决啊?
[...] 请君移步:http://cnodejs.org/blog/?p=3904 此条目是由 梅花Q 发表在 爱写代码 分类目录的。将固定链接加入收藏夹。 [...]
[...] 完整的靜態檔案伺服器範例 包含 mime 分割 stream.. [...]
文章写的很好,步步深入,通俗易懂。。。 真是深入浅出。。。顶!期待下文。。。
写的很用心,赞一个. === stream的形式底层是否调用了sendfile stream 仅有 “read” 的语义,sendfile 是 “read” + ”send“ nodejs 的 readStream 就是在另外的线程池中执行 unix 的read 哦 和sendfile没得关系的
这种性能不能和用sendfile的比吧?
太帅了,好棒啊! 唉,近两天安装npm一直没成功,无论是window还是ubuntu,我都快失去信心了~
楼主你的Range不规范
请求下载整个文件:
GET /test.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
一般正常回应
HTTP/1.1 200 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Range: bytes 0-800/801 //801:文件总大小
你的测试是 Range: 0-20
少了 bytes=
file.size Content-length !== gzip Content-length 会出现一直loading,但图片已经传完了。
文章写的很好啊,通俗易懂,很实用。 我知道我要测试什么了,哈哈!
用node的fs.createReadStream的方式,已经比较令人满意了。关于sendfile,这个api看起来还不是一个public的api,还不清楚stream的形式底层是否调用了sendfile。有详细资料后,再讨论这个问题。
保持所有的编码一致就可以。推荐 utf-8
mark
文件服务器的思路还是比较通用的 :)
我正好需要写一个文件上传下载服务器给C客户端使用,可以好好学习下这篇文章了。呵呵。
刚接触nodejs不久,见到这篇文章 眼前顿时亮了
感觉很不错啊,
如果那这个作为企业网站的未见服务器,大家觉得如何?
@Jackson 这个bug有解决方法吗?
深入浅出啊(虽然我不懂这个词到底是个什么意思)。 如果这样的文章更多点的话,Nodejs的发展就不成问题了,小的作为一个菜鸟竟然也能体验到亲手打造静态服务器的过程。
if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) 这句话也写错了吧,难道就必须相等才行吗,判断条件应该是request.headers[ifModifiedSince])晚于lastModified 吧
讲的太细致了,需要细细的品味!~
感谢分享,很受用!
This type of response MUST NOT have a body. Ignoring write() calls
好东东,学习,本来我也想写一个,看来省了
@Jackson +1。。。
mark
mark
mark
mark
mark
+1
mark
简直写的太好了 ,,,, express那些非要用路由才行
通俗易懂的好文
没有人会这么做
比深入浅出看着更有味儿
var row = fs.createReaderStream(filepath) row.pipe(response) 怎么页面什么都不显示啊
###启发很大
这个是用于判断文件是否有变化....有变化,不管是晚于还是早于都要改变(早于和晚于取决于服务器时钟)
使用Node.js做静态文件服务器,其性能如何?
楼主,这个服务器貌似还是存在些bug。 例如访问根目录的话 http://localhost:8888/ 会导致程序崩溃
又例如:在asset目录下,再创建一个img目录,如果img目录为空,访问 http://localhost:8888/img/ 的话,也会导致程序崩溃。
应该对目录再添加判断。
最后非常感谢你的教程,为nodejs的新手带来了很好的入门资料。