如何使带或不带尾随反斜杠的参数化 Express 路由工作?

How to make parameterized Express route work with or without trailing backslash?

我有一个非常简单的应用程序,总是会使用以下 URL 结构进行访问:www.myapplication.com/some/deep/nested/1234567890/

其中 1234567890 是用户的帐号,每个用户可能不同。目前,如果最后一个尾部反斜杠被关闭,则无法访问该应用程序:www.myapplication.com/some/deep/nested/1234567890

事实上,如果以这种方式访问​​应用程序,URL 会更改为:www.myapplication.com/1234567890

鉴于我的 app.js 中的以下内容:

app.use('/', api);
app.use('/:user', express.static(path.join(__dirname, 'dist')));

其中 api 是一个简单的快速路由器本身,我的 React 应用程序使用 jQuery 调用它,它使用 req.params 中的用户号码,我怎样才能使应用程序可以使用尾随的反斜杠与否?

我试过各种方法,例如:

app.use('/:user/?', express.static(path.join(__dirname, 'dist')));

app.use(express.static(path.join(__dirname, 'dist')));

后面防止url被截断,但只有在没有用户账号的情况下才有效,这显然是必要的:www.myapplication.com/some/deep/nested/

如果我去 www.myapplication.com/some/deep/nested/1234567890www.myapplication.com/some/deep/nested/1234567890/

url 没有被截断,但我得到 Cannot GET /1234567890Cannot GET /1234567890/

我也试过改组位置无济于事:

app.use('/:user', express.static(path.join(__dirname, 'dist')));
app.use('/', api);

我为此使用 express-slash。它是一个简单的中间件,在不存在时附加一个尾部斜线。然后你只需要处理包含尾部斜杠的路由。这可以说是更可取的,因为 www.myapplication.com/some/deep/nested/1234567890www.myapplication.com/some/deep/nested/1234567890/ 是不同的路径,并且为两者呈现相同的响应并不理想(就 SEO 而言,最相关)。

好吧,我想出了一个非常适合我的情况的变通方法,在大多数情况下都行不通。我将 post 放在这里,以便其他人可以改进答案。我添加了以下中间件:

app.use('/', api);
app.use(function(req, res, next) {
  if(req.url.substr(-1) !== '/' && req.url.length > 1 && req.url.substr(-3) !== 'css' && req.url.substr(-2) !== 'js'){
    res.redirect(301, '/some/deep/nested' + req.url + '/');
  }else{
    next();
  }
});
app.use('/:user', express.static(path.join(__dirname, 'dist')));

if 语句检查 css 和 js 文件并防止将反斜杠添加到它们(我在添加这些检查之前看到的一个问题)。

同样,这适用于我面临的特定情况,但我希望那里有更好的答案。