在 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.htmlmysite.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 文件。