Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ExpressJS如何确定请求的资源是否为;“静态”;文件_Express_Jspm - Fatal编程技术网

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

ExpressJS如何确定请求的资源是否为;“静态”;文件,express,jspm,Express,Jspm,我使用JSPM管理客户端依赖项,并使用ExpressJS提供文件 我的目录结构是 节点单元 路线 观点 app.js 公开的 css 图像 js main.js jspm_包 system.js npm angular2@2.0.0-beta.7.js 我在我的Express app.js中设置了静态路线,如下所示: app.use(express.static(path.join(__dirname, 'public'))); 正如我在

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

  • 节点单元
  • 路线
  • 观点
  • app.js
  • 公开的
    • css
    • 图像
    • js
      • main.js
    • jspm_包
      • system.js
      • npm
        • angular2@2.0.0-beta.7.js
我在我的Express app.js中设置了静态路线,如下所示:

app.use(express.static(path.join(__dirname, 'public')));
正如我在请求GET/jspm_包/system.js时所期望的那样 它正确地提供文件

但是当我请求GET/jspm_包/npm时/angular2@2.0.0-beta.7.js 它给了我一个404-找不到

我怀疑文件名中的某些特殊字符会使express无法将请求解析为“静态”文件并使用正确的静态路由

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


谢谢。

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

根据您的问题,
express如何将资源标识为静态的?
,实际上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
注册的路由将永远不会被调用。现在,如果您执行相同的操作,只需将名为
users
的文件从
public
文件夹中删除,那么
express.static
中间件将无法找到匹配的文件,并将请求传递给链中的下一个中间件,即
routes.get(
/users'`

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

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

请再次确认以下内容:

  • 首先注册您的
    express.static
    中间件
  • 您试图访问的资源存在,即物理路径存在。(资源url不区分大小写,即
    /USERS
    /USERS
    都将匹配文件
    /public/USERS
    (如果存在)
  • 确保你没有打字错误
  • 如果这不能解决您的问题,请共享您的app.js文件,如果无法共享所有内容,请共享一些内容


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

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

    根据您的问题,
    express如何将资源标识为静态的?
    ,实际上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
    注册的路由将永远不会被调用。现在,如果您执行相同的操作,只需将名为
    users
    的文件从
    public
    文件夹中删除,那么
    express.static
    中间件将无法找到匹配的文件,并将请求传递给链中的下一个中间件,即
    routes.get(
    /users'`

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

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

    Ple