ExpressJS如何确定所请求的资源是否是“静态”文件?

时间:2016-02-26 00:07:20

标签: express jspm

我正在使用JSPM来管理我的客户端依赖项并使用ExpressJS提供文件 我的目录结构是

  • node_modules
  • 路由
  • 视图
  • app.js
  • 公共
    • CSS
    • 图像
    • JS​​
      • main.js
    • jspm_packages
      • system.js
      • NPM
        • angular2@2.0.0-beta.7.js

我的Express app.js中有静态路由设置,如下所示:

app.use(express.static(path.join(__dirname, 'public')));

当我请求GET /jspm_packages/system.js时,正如预期的那样 它正确地提供文件

然而,当我请求GET /jspm_packages/npm/angular2@2.0.0-beta.7.js 它给了我一个404 - 没找到。

我怀疑文件名中的某些特殊字符是通过将请求解析为“静态”文件并使用正确的静态路由来表达的。

如何测试express是否将请求标记为“静态”? 如何覆盖快递用于将请求标记为“静态”的快速正则表达式(或任何机制)? 如何使用自己的正则表达式编写自定义中间件并将请求转发给静态呢?

感谢。

1 个答案:

答案 0 :(得分:1)

使用express时,必须确保正确的中间件以正确的顺序注册。

根据你的问题,How does express identifies a resource as static?,实际上express不确定它是否静态,它甚至不理解请求类型,表达的是为给定请求执行适当的中间件。

当express收到请求时,它会按顺序开始执行匹配的中间件,直到它们用完为止。

因此在实践中,您将始终在动态路由之前首先注册静态中间件(仅在请求解析器之后)。如下所示...

var express = require('express');
var path = require('path');

var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

//Register your static middleware
app.use(express.static(path.join(__dirname, 'public')));

//Other cool code

app.use('/', routes);

现在,请求将首先通过express.static中间件,如果找不到匹配的文件,它将在内部调用next并将请求传递给链中的下一个中间件。

意思是,假设您在名为public的{​​{1}}目录中有一个静态文件,并且您有一条名为users的路由。现在,当用户请求routes.get('/users' ....时,请求将首先传递到/users,如果找到express.static文件(在这种情况下它会执行),我们使用{{1}注册的路由永远不会被召唤。现在,如果你这样做但只是从users文件夹中删除名为routes.get的文件,那么users中间件将无法找到匹配的文件并将请求传递给下一个中间件在链中,即public / users'...`

  

Express不会通过匹配或使用正则表达式来假定或将资源标识为静态。如果express.static中间件找到它,它将为其提供服务,否则它会将请求传递给队列中的下一个中间件。

虽然我很确定,但我尝试重现您的问题,并且我收到了包含所有特殊字符的文件,如下图所示。

enter image description here

请再次确认以下内容:

  1. 您的routes.get(中间件首先注册。
  2. 您尝试访问的资源存在,即物理路径存在。 (资源网址不区分大小写,例如express.staticexpress.static两者都匹配文件/USERS(如果存在)。
  3. 确保您没有拼写错误。
  4. 如果这不能解决您的问题,请分享您的app.js文件,如果您无法共享所有内容,请分享一些内容。

    希望这有帮助!如果您需要进一步的帮助,请告诉我......:)