除了以/ api开头的所有路由运行express中间件?

时间:2015-07-01 02:09:58

标签: regex node.js express

我有一个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开头的任何路径。

谢谢!

我已经看过this SO帖子,但找不到对我有用的东西。

并且this post包含许多变通方法,这也不是我想要的。

This帖子要求您有条件地检查中间件中的URL。

3 个答案:

答案 0 :(得分:9)

试试这个:

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 }));
  });
});

答案 1 :(得分:1)

这就是我处理不存在的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();
});

答案 2 :(得分:0)

我很确定我拥有与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/*

的模式