我希望我的路线能够匹配并非以" / api /&#34开头的网址;
例如," /"," / home"," / profile"将触发路线,但" / api / user / get"和" / api / xx"不会。
我尝试过以下正则表达式及其修改:
app.get('/^(?!api)', function(req, res) {})
答案 0 :(得分:2)
这种路由器组织通常无法使用正则表达式来解决 路由匹配,而是路由器和默认的概念 匹配。
路由器概念允许您将路由组织成逻辑路由 单位,例如包含API路径和文件的文件 包含您的其他路线。
默认路线匹配尚未匹配的路线。
因此,在您的情况下,您可能有一个主应用程序,其中包含一个路由器 API调用,其他调用的路由器,然后是默认路由 与其他一切相匹配。
默认路由通常用于返回404,但您可以使用它 捕获"所有不以" / api"开头的路线,意识到没有 页面将是404。
这里有一些工作的骨架代码来说明:
var express = require('express');
var app = express();
// The "non-API Router is likely to exist in a separate file
var nonAPIrouter = express.Router();
// More routes unrelated to APIs
//nonAPIRouter.get();
//////////////////////////////////////////
// The API router may be in it's own file, too.
var APIrouter = express.Router();
// Routes that start with /API
APIrouter.get('/api*', function (req, res) {
res.send('Hello API!');
});
///////////////////////////////////////
// The main app includes both routers.
app.use(APIrouter);
app.use(nonAPIrouter);
// Default route for requests not matched above
app.use(function(req, res) {
res.status(404).end('error');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
答案 1 :(得分:1)
马克的回答把我指向了路由器(),这帮我提出了一个解决方案。它可能不优雅,但它适用于我。我定义了一个中间件并在那里做正则表达式(我简化为/ a)。如果它不匹配则执行其工作,否则转移到/ a / ***
app.use(function(req, res, next) {
if (!req.url.match(/\/a\/*/g)) {
res.sendFile('index.html'));
}
else {
next();
}
});
var router = express.Router();
router.get(...)
router.post(...)
app.use('/a', router);