Express.js(Node.js):静态文件服务是如何实现的?

3
我认为使用Express提供静态文件(html、mov、css、jpg等)需要在nginx中进行一些技巧操作。
但是似乎在Express中,静态文件可以“顺利工作”,不需要特别的操作。
以下是需要回答的问题:
1. Express如何实现静态文件服务?
2. 为什么有些人主张使用nginx来处理静态文件?这其中必定有一个好的理由。(例如:https://gist.github.com/joemccann/644282)
3. 在静态文件下载期间,Node.js事件队列是否会被阻塞?我想不会,但为什么呢?
3个回答

5

使用express.static()中间件可以在express中进行静态文件服务。该中间件将在磁盘上查找您要请求的文件,如果找到,则会通过编写http标头然后是内容来提供它们。为了使所有这些工作正常运行,您需要在中间件堆栈中添加app.use(express.static(...))

出于多种原因,建议使用ngnix,我认为最重要的原因如下:

  1. 它快得多

  2. 您拥有更多的灵活性。使用挂载点、重写规则、磁盘位置等等。更改ngnix配置比更改代码更容易。此外,这种灵活性允许ngnix处理一些或所有静态文件,同时将其他工作(动态内容?静态文件的其他部分?)委托给其他人(您的node.js进程、CDN等)

节点请求队列不会被阻塞,这就是节点的工作方式:请求被“快速”异步处理,从而释放单个线程以执行更多工作,例如接受和处理新请求。您的文件是“在后台”发送的,当完成时,您(或真正发送它们的代码)将收到通知。


4

如果url不属于您通过app.get(/...(或POST等)方法注册的任何路径,则Express将发送该文件,如果设置了静态路径并且您提供的路径属于静态文件目录下的某些文件路径,则会发送该文件。文件发送仅是,它们不会完全阻塞事件队列,它们只是被推送到队列中,并且随着接收到的块,它们被管道传输到HTTP连接上,所以它们发生在代码后台。建议使用nginx的原因是它更适合这项工作,即提供文件和路由,并且它也是用C编写的,并针对该工作进行了优化,而NodeJS与Nginx相比是一个更通用的工具。


1
在我的主服务器文件(app.js)中,我有以下内容。
var express = require('express');
var app = express();
var path = require('path');
...
app.use(express.static(path.join(__dirname, 'public')));

我的文件夹是:

/public/js
/public/css
/public/img

这些被作为静态文件提供,因此无需重新启动应用程序即可查看更改。关于速度与nginx相比无法确定,但在阅读了Nitzan Shaked的答案之后,我会尝试使用nginx!
编辑:对于此示例,您需要connect(npm install connect)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接