如何使用或不使用反斜杠来使参数化Express路线工作?

时间:2016-03-02 18:50:14

标签: javascript node.js express url-routing

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

1234567890是用户的帐号,每个用户可以有不同的帐号。目前,如果最终的尾部反斜杠保持不变,则无法访问该应用:www.myapplication.com/some/deep/nested/1234567890

事实上,如果通过以下方式访问应用,则网址会发生变化: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')));

后者会阻止网址被截断,但只能在没有用户帐号的情况下运行,这显然是必要的:www.myapplication.com/some/deep/nested/

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

网址未被截断,但我得到Cannot GET /1234567890Cannot GET /1234567890/

我也试过改变这些职位无济于事:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

好吧,我想出了一个hacky,解决方法来做这个非常特定于我的情况,并且在大多数情况下不会工作。我会在这里发布,以便其他人可以改进答案。我添加了以下中间件:

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文件,并防止反斜杠被添加到它们中(在添加这些检查之前我遇到的一个问题)。

同样,这适用于我所面临的具体情况,但我希望有一些更好的答案潜伏在那里。