101

我目前正在编写一个 API,它将要求用户在每个请求的标头中传递一个身份验证令牌。现在我知道我可以创建一个包罗万象的路线说

app.get('/*', function(req,res){

});

但我想知道如何使它排除某些路线,例如/loginor /

4

5 回答 5

144

我不确定当用户访问/login或时你想要发生什么/,但你可以为它们创建单独的路由;如果您在包罗万象之前声明它们,它们会在处理传入请求时获得优先权:

app.get('/login', function(req, res) {
  ...
});

app.get('/', function(req, res) {
  ...
});

app.get('*', function(req, res) {
  ...
});
于 2013-10-11T08:13:31.440 回答
54

您始终可以在要排除的路线之后放置包罗万象的路线(请参阅robertklep答案)。

但有时您根本不想关心路线的顺序。在这种情况下,你仍然可以做你想做的事:

app.get('*', function(req, res, next) {
  if (req.url === '/' || req.url === '/login') return next();
  ...
});
于 2013-10-11T10:16:31.443 回答
27

如果您想在每个请求中验证凭据或真实性,您应该使用“全部”快速路由功能,您可以像这样使用它:

app.all('/api/*', function(req, res, next){
    console.log('General Validations');
    next();
});

你可以把它放在任何路由的东西之前。

请注意,在这种情况下,我使用“/api/ ”作为路径,您可以使用“/ ”来满足您的需要。

希望在这里帮助别人还为时不晚。

于 2015-10-21T17:47:53.760 回答
12

制作包罗万象的路由处理程序的另一种方法是:

app.get('/login', function(req, res) {
  //... login page
});
app.get('/', function(req, res) {
  //...index page
});
app.get('/:pageCalled', function(req, res) {
  console.log('retrieving page: ' + req.params.pageCalled);
  //... mypage.html
});

这与 robertklep 的(已接受)答案完全相同,但它为您提供了有关用户实际请求的更多信息。您现在有一个 slugreq.params.pageCalled来表示正在请求的任何页面,并且如果您有几个不同的页面,可以将用户引导到适当的页面。

使用这种方法需要注意的一个问题(thx @agmin),/:pageCalled只会用一个 捕获路线/,所以你不会得到/route/1,等等。使用额外的 slugs 像/:pageCalled/:subPageCalled更多页面(thx @softcode)

于 2014-04-09T00:14:11.863 回答
4

负前瞻正则表达式

也许这有时会派上用场:

const app = require('express')()
app.get(/^\/(?!login\/?$)/, (req, res) => { res.send('general') })
app.get('*',                (req, res) => { res.send('special') })
app.listen(3000)

有了这个,你会得到:

/           general
/asdf       general
/login      special
/login/     special
/login/asdf general
/loginasdf  general

或者,如果您还想/login/asdf成为special

app.get(/^\/(?!login($|\/.*))/, (req, res) => { res.send('general') })

特别是,当我在这里谷歌搜索时,我正在考虑在为 SPA 执行 API 的同一台服务器上提供静态前端文件的情况:

const apiPath = '/api';
const buildDir = path.join(__dirname, 'frontend', 'build');

// Serve static files like /index.html, /main.css and /main.js
app.use(express.static(buildDir));
// For every other path not under /api/*, serve /index.html
app.get(new RegExp('^(?!' + config.apiPath + '(/|$))'), function (req, res) {
  res.sendFile(path.join(buildDir, 'index.html'));
});

// Setup some actions that don't need to be done for the static files like auth.
// The negative lookahead above allows those to be skipped.
// ...

// And now attach all the /api/* paths which were skipped above.
app.get(apiPath, function (req, res) { res.send('base'); });
app.get(apiPath, function (req, res) { res.send('users'); });

// And now a 404 catch all.
app.use(function (req, res, next) {
  res.status(404).send('error: 404 Not Found ' + req.path)
})

// And now for any exception.
app.use(function(err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('error: 500 Internal Server Error')
});

app.listen(3000)

在 express@4.17.1、Node.js v14.17.0 上测试。

于 2021-04-27T16:52:44.220 回答