我正在使用快递。我喜欢创建一个路由,将所有类型为“get”的请求导航到“/assets/app/static/pagePath”,并使用 url 前缀“/app/static/*pagePath”。我正在尝试执行以下操作,但不起作用。
app.get('/app/static/*path', function (req, res) {
res.sendfile('assets/app/static/' + req.params.path);
});
任何的想法?
只需使用带有前缀和一些短路逻辑的中间件:
app.use('/app/static', function (req, res, next) {
if (req.method !== 'get') {
next();
return;
}
res.sendFile(__dirname + '/assets' + req.path);
});
(这是未经测试的,所以可能不是 100% 准备好,但你明白了)
express.static
实际上,再次查看您的问题,您确定仅给定正确的根目录就不能由中间件处理吗?
app.use('/app/static', express.static(__dirname + '/assets'));
如果要包含子目录,可以使用正则表达式;此正则表达式将匹配下的任何目录/文件结构/app/static/
app.get(/^\/app\/static\/(.*)/, function (req, res) {
console.log('assets/app/static/' + req.params[0]);
res.sendfile('assets/app/static/' + req.params[0]);
});
至于您关于多个静态目录的问题,是的,您可以。两者兼而有之app.use
;
app.use("/static", express.static(__dirname + "/assets"));
app.use("/static", express.static(__dirname + "/alternate_assets"));
该文件将从找到它的第一个目录提供(/assets
先搜索,然后/alternate_assets
是 ),但为了减少混淆,您可能希望避免在两个目录中使用相同的文件名。
过去没有其他答案对我有用,因为它们缺少两个小细节:
app.use
定义静态目录的调用应该是异步的(例如,包装在一个函数中),否则它们将在 websocket 完成建立连接之前尝试执行(在我看来,这是 Connect 的一个问题——Express 所基于的框架顶部;我应该能够在文件顶部开始编写我的代码)。
这些定义需要在您发送将引用 URL 的 HTML 文件之前在该(异步)函数体内进行。
像这样:
app.get('/', function (req, res) {
app.use('/static', express.static(__dirname + '/static'));
res.sendfile(__dirname + '/index.html');
});
然后您可以将它们直接包含在您的 HTML(或 SVG 等)中,如下所示:
•<link rel="stylesheet" href="static/index.css">
•<image x="0" y="0" xlink:href="static/picture.svg" />
• ETC。
GET /app/static/foo/bar/buz ---> req.path === /app/static/foo/bar/buz 所以:
app.get('/app/static/:path*', function (req, res) {
res.sendfile('assets' + req.path);
});