在 Express 中混合通配符和参数
Mixing Wildcards and Parameters in Express
我有 Minecraft Overviewer 在以下位置生成的网页内容:
/home/mc/backups/servername/latest/overviewer
我有一个非常 简单的服务器express/nodejs。这是我的 app.js:
var express = require('express');
var app = express();
//----------------------------------------------------------------------------+
// Each server's root points to the latest overviewer page |
//----------------------------------------------------------------------------+
app.get('/minecraft/:server/*', function(req, res) {
console.log('HELLO?');
res.send('Finally some luck!');
/*
var
server = req.params.server,
file = req.params[0] ? req.params[0] : 'index.html',
dir = '../backups/' + server + '/latest/overviewer';
res.sendFile(file, { root: dir });
*/
});
app.use(express.static('www'));
app.listen(80, function () {
console.log('Web server listening on port 80');
});
我包含的代码比 运行 多一点,因此您可以看到我的意图,以防这是一个 xy 类问题。我想路由静态文件,但我认为我不能使用 express.static
,因为我希望 URL 的映射与我的文件结构略有不同(并且基于服务器名称) .
那么我的简单服务器有什么问题?当我尝试导航到 mysite.com/minecraft/isopre
时,我看到了一个显示 Cannot GET /minecraft/isopre
的白页。如果我从第 7 行路由的字符串末尾删除 *
,我会看到 Finally some luck!
。但我想要那颗星,这样我就可以将 mysite.com/minecraft/isopre
映射到 index.html
或 mysite.com/minecraft/isopre/overviewer.js
。
那么执行此操作的正确方法是什么?
为了执行理想的操作,我建议您使用 ? 符号作为正则表达式:
app.get('/minecraft/:server/:file?', function(req, res, next) {
if('undefined' != typeof req.params.file && req.params.file) {
var file = req.params.file;
}
if('undefined' != typeof req.params.server && req.params.server) {
var server = req.params.server;
}
});
在这种情况下,:file 变为可选,并且 node.js 如果没有通配符,您的整个应用程序都不会失败。
因此,如果 req.params.file 变量未定义,您可以提供 index.html 文件。
我有 Minecraft Overviewer 在以下位置生成的网页内容:
/home/mc/backups/servername/latest/overviewer
我有一个非常 简单的服务器express/nodejs。这是我的 app.js:
var express = require('express');
var app = express();
//----------------------------------------------------------------------------+
// Each server's root points to the latest overviewer page |
//----------------------------------------------------------------------------+
app.get('/minecraft/:server/*', function(req, res) {
console.log('HELLO?');
res.send('Finally some luck!');
/*
var
server = req.params.server,
file = req.params[0] ? req.params[0] : 'index.html',
dir = '../backups/' + server + '/latest/overviewer';
res.sendFile(file, { root: dir });
*/
});
app.use(express.static('www'));
app.listen(80, function () {
console.log('Web server listening on port 80');
});
我包含的代码比 运行 多一点,因此您可以看到我的意图,以防这是一个 xy 类问题。我想路由静态文件,但我认为我不能使用 express.static
,因为我希望 URL 的映射与我的文件结构略有不同(并且基于服务器名称) .
那么我的简单服务器有什么问题?当我尝试导航到 mysite.com/minecraft/isopre
时,我看到了一个显示 Cannot GET /minecraft/isopre
的白页。如果我从第 7 行路由的字符串末尾删除 *
,我会看到 Finally some luck!
。但我想要那颗星,这样我就可以将 mysite.com/minecraft/isopre
映射到 index.html
或 mysite.com/minecraft/isopre/overviewer.js
。
那么执行此操作的正确方法是什么?
为了执行理想的操作,我建议您使用 ? 符号作为正则表达式:
app.get('/minecraft/:server/:file?', function(req, res, next) {
if('undefined' != typeof req.params.file && req.params.file) {
var file = req.params.file;
}
if('undefined' != typeof req.params.server && req.params.server) {
var server = req.params.server;
}
});
在这种情况下,:file 变为可选,并且 node.js 如果没有通配符,您的整个应用程序都不会失败。
因此,如果 req.params.file 变量未定义,您可以提供 index.html 文件。