我有一个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/*
模式。