对所有路由运行express中间件,但以/api开头的路由除外



我有一个Express中间件,它在服务器上像这样呈现React,放在最后,在所有其他路由之后:

app.use(function(req, res) {
  Router.run(routes, req.path, function(Handler) {
    var markup = React.renderToString(<Handler />);
    res.send(swig.renderFile('views/index.html', { html: markup }));
  });
});

由于没有指定路由,因此该中间件将对所有请求执行。我想从中排除所有/api路由。问题是即使我在这个中间件之前创建了所有API路由,这个中间件也总是有可能在/api/nonexistantendpoint路径上执行。

更准确地说,我正在寻找一个正则表达式,它可以使该中间件在除以/api开头的任何路径之外的所有路径上执行。

谢谢!


我已经看了这个SO帖子,但找不到任何对我有用的东西。

这篇文章包含了很多变通方法,这也不是我想要的。

这篇文章要求您有条件地检查中间件中的URL。

试试这个:

app.use(/^/(?!api).*/, function(req, res) {
  Router.run(routes, req.path, function(Handler) {
    var markup = React.renderToString(<Handler />);
    res.send(swig.renderFile('views/index.html', { html: markup }));
  });
});

这就是我处理不存在的api路由的方式。我有一个api文件夹,其中包含我所有的api路由,理想情况下,每个路由都在自己的js文件中,api/index.js需要所有这些路由,比如这个

var router = require('express').Router();
router.use(require('./users'));
router.use(require('./it'));
//other routes.js

然后在我的api/index.js的末尾,我有这个

router.use('/*', function(req, res) { //this will reject any /api/nonexistant routes
  res.send(500).end();
});

在我的服务器js中,我包含了我的api路由第一个

app.use('/api', require('./api'));
app.use(function(req, res) {
  console.log('dosomething');
  res.send('Hello something').end();
});

我很确定我的用例与Sahat完全相同,以下是我在Express.js:中配置两个路由以处理/api匹配和未命中的语法

// /api/* Matches
app.get( '^/api/:params*', function( req, res, next ) {
    res.send( "Matches an /api/ route." );
} );
// /api/* Misses
app.get( /^((?!/api/).)*$/, function( req, res, next ) {
    res.send( "NOT an /api/ route." );
} );

这假设您的所有API路由都遵循/api/*模式。