我目前正在编写一个 API,它将要求用户在每个请求的标头中传递一个身份验证令牌。现在我知道我可以创建一个包罗万象的路线说
app.get('/*', function(req,res){
});
但我想知道如何使它排除某些路线,例如/login
or /
?
我不确定当用户访问/login
或时你想要发生什么/
,但你可以为它们创建单独的路由;如果您在包罗万象之前声明它们,它们会在处理传入请求时获得优先权:
app.get('/login', function(req, res) {
...
});
app.get('/', function(req, res) {
...
});
app.get('*', function(req, res) {
...
});
您始终可以在要排除的路线之后放置包罗万象的路线(请参阅robertklep答案)。
但有时您根本不想关心路线的顺序。在这种情况下,你仍然可以做你想做的事:
app.get('*', function(req, res, next) {
if (req.url === '/' || req.url === '/login') return next();
...
});
如果您想在每个请求中验证凭据或真实性,您应该使用“全部”快速路由功能,您可以像这样使用它:
app.all('/api/*', function(req, res, next){
console.log('General Validations');
next();
});
你可以把它放在任何路由的东西之前。
请注意,在这种情况下,我使用“/api/ ”作为路径,您可以使用“/ ”来满足您的需要。
希望在这里帮助别人还为时不晚。
制作包罗万象的路由处理程序的另一种方法是:
app.get('/login', function(req, res) {
//... login page
});
app.get('/', function(req, res) {
//...index page
});
app.get('/:pageCalled', function(req, res) {
console.log('retrieving page: ' + req.params.pageCalled);
//... mypage.html
});
这与 robertklep 的(已接受)答案完全相同,但它为您提供了有关用户实际请求的更多信息。您现在有一个 slugreq.params.pageCalled
来表示正在请求的任何页面,并且如果您有几个不同的页面,可以将用户引导到适当的页面。
使用这种方法需要注意的一个问题(thx @agmin),/:pageCalled
只会用一个 捕获路线/
,所以你不会得到/route/1
,等等。使用额外的 slugs 像/:pageCalled/:subPageCalled
更多页面(thx @softcode)
负前瞻正则表达式
也许这有时会派上用场:
const app = require('express')()
app.get(/^\/(?!login\/?$)/, (req, res) => { res.send('general') })
app.get('*', (req, res) => { res.send('special') })
app.listen(3000)
有了这个,你会得到:
/ general
/asdf general
/login special
/login/ special
/login/asdf general
/loginasdf general
或者,如果您还想/login/asdf
成为special
:
app.get(/^\/(?!login($|\/.*))/, (req, res) => { res.send('general') })
特别是,当我在这里谷歌搜索时,我正在考虑在为 SPA 执行 API 的同一台服务器上提供静态前端文件的情况:
const apiPath = '/api';
const buildDir = path.join(__dirname, 'frontend', 'build');
// Serve static files like /index.html, /main.css and /main.js
app.use(express.static(buildDir));
// For every other path not under /api/*, serve /index.html
app.get(new RegExp('^(?!' + config.apiPath + '(/|$))'), function (req, res) {
res.sendFile(path.join(buildDir, 'index.html'));
});
// Setup some actions that don't need to be done for the static files like auth.
// The negative lookahead above allows those to be skipped.
// ...
// And now attach all the /api/* paths which were skipped above.
app.get(apiPath, function (req, res) { res.send('base'); });
app.get(apiPath, function (req, res) { res.send('users'); });
// And now a 404 catch all.
app.use(function (req, res, next) {
res.status(404).send('error: 404 Not Found ' + req.path)
})
// And now for any exception.
app.use(function(err, req, res, next) {
console.error(err.stack)
res.status(500).send('error: 500 Internal Server Error')
});
app.listen(3000)
在 express@4.17.1、Node.js v14.17.0 上测试。