CNode

用NodeJS打造你的静态文件服务器

分享
JJacksonTian发布于15 年前最后回复10 年前57 回复124406 浏览0 收藏
查看回复

回复 (57)

A
anonymous#1·15 年前

好文!! 一个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 }

A
anonymous#2·15 年前

赞!

A
anonymous#3·15 年前

写的真好,由浅入深,很清晰,让人了解每部分代码是怎么从构造出来,添加进去的

A
anonymous#4·15 年前

赞,非常值得学习!

A
anonymous#5·15 年前

[...] 本文转载自CNode社区田永强的文章。 [...]

A
anonymous#6·15 年前

[...] 嗯,在写完几个简单的控制器和模板之后,我没有往m层走,而是转向去完成一个node版本的静态服务器,通过朴灵同学的这篇文章可以简单了解实现技术,我就不多说了。。最开始我实现的和他差不多,看过他的之后觉得他的那种方法更好。貌似是从来外的书上翻译来的……?看看你就知道了。http://cnodejs.org/blog/?p=3904 [...]

A
anonymous#7·15 年前

[...] 嗯,在写完几个简单的控制器和模板之后,我没有往m层走,而是转向去完成一个node版本的静态服务器,通过朴灵同学的这篇文章可以简单了解实现技术,我就不多说了。。最开始我实现的和他差不多,看过他的之后觉得他的那种方法更好。貌似是从来外的书上翻译来的……?看看你就知道了。http://cnodejs.org/blog/?p=3904 [...]

A
anonymous#8·15 年前

[...] 推荐一篇本技术的好文章: 用NodeJS打造你的静态文件服务器 发表评论 | Trackback [...]

A
anonymous#9·15 年前

使用"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(); }); } 中文显示是乱码,请教你啊,是什么原因呢?

A
anonymous#10·15 年前

在浏览器中response中文显示乱码如何解决啊?

A
anonymous#11·15 年前

[...] 请君移步:http://cnodejs.org/blog/?p=3904 此条目是由 梅花Q 发表在 爱写代码 分类目录的。将固定链接加入收藏夹。 [...]

A
anonymous#12·15 年前

[...] 完整的靜態檔案伺服器範例 包含 mime 分割 stream.. [...]

A
anonymous#13·15 年前

文章写的很好,步步深入,通俗易懂。。。 真是深入浅出。。。顶!期待下文。。。

A
anonymous#14·15 年前

写的很用心,赞一个. === stream的形式底层是否调用了sendfile stream 仅有 “read” 的语义,sendfile 是 “read” + ”send“ nodejs 的 readStream 就是在另外的线程池中执行 unix 的read 哦 和sendfile没得关系的

A
anonymous#15·15 年前

这种性能不能和用sendfile的比吧?

A
anonymous#16·15 年前

太帅了,好棒啊! 唉,近两天安装npm一直没成功,无论是window还是ubuntu,我都快失去信心了~

C
chishaxie#17·15 年前

楼主你的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=

M
mxfli#18·15 年前

file.size Content-length !== gzip Content-length 会出现一直loading,但图片已经传完了。

D
DoubleSpout#19·15 年前

文章写的很好啊,通俗易懂,很实用。 我知道我要测试什么了,哈哈!

J
JacksonTian#20·15 年前

用node的fs.createReadStream的方式,已经比较令人满意了。关于sendfile,这个api看起来还不是一个public的api,还不清楚stream的形式底层是否调用了sendfile。有详细资料后,再讨论这个问题。

J
JacksonTian#21·15 年前
引用 anonymous在浏览器中response中文显示乱码如何解决啊?

保持所有的编码一致就可以。推荐 utf-8

M
mzTeamMeatMan#23·11 年前

mark

N
nodexy#24·14 年前

文件服务器的思路还是比较通用的 :)

X
xuhaijinsky2008#26·14 年前

我正好需要写一个文件上传下载服务器给C客户端使用,可以好好学习下这篇文章了。呵呵。

L
luoage#27·14 年前

刚接触nodejs不久,见到这篇文章 眼前顿时亮了

Z
zdarks#28·14 年前

感觉很不错啊,

S
sinple#29·14 年前

如果那这个作为企业网站的未见服务器,大家觉得如何?

A
alsotang#31·14 年前

深入浅出啊(虽然我不懂这个词到底是个什么意思)。 如果这样的文章更多点的话,Nodejs的发展就不成问题了,小的作为一个菜鸟竟然也能体验到亲手打造静态服务器的过程。

H
hkant#32·14 年前

if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) 这句话也写错了吧,难道就必须相等才行吗,判断条件应该是request.headers[ifModifiedSince])晚于lastModified 吧

S
smallsilver#33·14 年前

讲的太细致了,需要细细的品味!~

C
cuiter#34·14 年前

感谢分享,很受用!

Y
yakczh#35·14 年前

This type of response MUST NOT have a body. Ignoring write() calls

L
leapon#36·13 年前

掩面推我的小品:https://github.com/leapon/smallweb

Y
yuenshui#38·13 年前

好东东,学习,本来我也想写一个,看来省了

J
j60017268#40·11 年前

mark

X
Xarrow#41·11 年前

mark

P
panhb#42·11 年前

mark

B
bianlin#43·11 年前

mark

G
gogoday#44·10 年前

mark

T
Tonyce#45·10 年前

+1

J
JerroldLee#46·10 年前

mark

M
ModleIory#47·10 年前

简直写的太好了 ,,,, express那些非要用路由才行

C
chengang4505#48·10 年前

通俗易懂的好文

H
huangyanxiong01#49·10 年前

没有人会这么做

G
g8up#50·12 年前

比深入浅出看着更有味儿

M
ModleIory#51·10 年前

var row = fs.createReaderStream(filepath) row.pipe(response) 怎么页面什么都不显示啊

C
crazyjune#52·14 年前

###启发很大

Y
youxiachai#53·14 年前
引用 hkantif (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) 这句话也写错...

这个是用于判断文件是否有变化....有变化,不管是晚于还是早于都要改变(早于和晚于取决于服务器时钟)

W
wbpmrck#55·13 年前

使用Node.js做静态文件服务器,其性能如何?

B
borisyu#57·13 年前

楼主,这个服务器貌似还是存在些bug。 例如访问根目录的话 http://localhost:8888/ 会导致程序崩溃

又例如:在asset目录下,再创建一个img目录,如果img目录为空,访问 http://localhost:8888/img/ 的话,也会导致程序崩溃。

应该对目录再添加判断。

最后非常感谢你的教程,为nodejs的新手带来了很好的入门资料。

参与回复
登录后即可参与回复。登录