【问题标题】:How does ExpressJS determine if a requested resource is a "static" file?ExpressJS 如何确定请求的资源是否为“静态”文件?
【发布时间】:2016-02-26 00:07:19
【问题描述】:

我正在使用 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 是否将请求标记为“静态”? 如何覆盖 express 正则表达式(或任何机制)express 用于将请求标记为“静态”? 如何使用自己的正则表达式编写自定义中间件并将请求转发到静态?

谢谢。

【问题讨论】:

  • 你有没有机会通过答案?

标签: express jspm


【解决方案1】:

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

根据你的问题,How does express identifies a resource as static?,实际上 express 并不确定它是否是静态的,它甚至不了解请求类型,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 目录中有一个名为users 的静态文件,并且您有一个名为routes.get('/users' .... 的路由。现在,当用户请求/users 时,请求将首先传递给express.static,如果它找到users 文件(在本例中就是这样),我们使用routes.get 注册的路由将永远不会被调用。现在,如果您执行相同操作,但只是从 public 文件夹中删除名为 users 的文件,则 express.static 中间件将无法找到匹配的文件,并将请求传递给链中的下一个中间件,即 routes.get( /用户的...`

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

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

请再次确认以下内容:

  1. 首先注册您的 express.static 中间件。
  2. 您尝试访问的资源存在,即物理路径存在。 (资源网址不区分大小写,即/USERS/users 都将匹配文件/public/users(如果存在)。
  3. 确保没有错字。

如果这不能解决您的问题,请分享您的 app.js 文件,如果您无法分享全部内容,请分享一些内容。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多