表达js路由匹配的URL,它不以字符串开头

时间:2016-01-25 22:23:17

标签: regex node.js express

我希望我的路线能够匹配并非以" / api /&#34开头的网址;

例如," /"," / home"," / profile"将触发路线,但" / api / user / get"和" / api / xx"不会。

我尝试过以下正则表达式及其修改:

app.get('/^(?!api)', function(req, res) {})

2 个答案:

答案 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);