使用 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 中间件找到它,它将为它提供服务,否则它将把请求传递给队列中的下一个中间件。
虽然我很确定,但我尝试重现您的问题,并收到了包含所有特殊字符的文件,如下图所示。
请再次确认以下内容:
- 首先注册您的
express.static 中间件。
- 您尝试访问的资源存在,即物理路径存在。 (资源网址不区分大小写,即
/USERS 和/users 都将匹配文件/public/users(如果存在)。
- 确保没有错字。
如果这不能解决您的问题,请分享您的 app.js 文件,如果您无法分享全部内容,请分享一些内容。
希望这会有所帮助!如果您需要进一步的帮助,请告诉我... :)