我需要在简单的node.js中使用以下express.js代码,我可以在中间件中使用。我需要根据网址进行一些检查,并希望在自定义中间件中进行检查。
app.get "/api/users/:username", (req,res) ->
req.params.username
到目前为止我有以下代码,
app.use (req,res,next)->
if url.parse(req.url,true).pathname is '/api/users/:username' #this wont be true as in the link there will be a actual username not ":username"
#my custom check that I want to apply
答案 0 :(得分:4)
一个技巧就是使用它:
app.all '/api/users/:username', (req, res, next) ->
// your custom code here
next();
// followed by any other routes with the same patterns
app.get '/api/users/:username', (req,res) ->
...
如果您只想匹配GET
个请求,请使用app.get
代替app.all
。
或者,如果您只想在某些特定路由上使用中间件,可以使用它(在JS中这次):
var mySpecialMiddleware = function(req, res, next) {
// your check
next();
};
app.get('/api/users/:username', mySpecialMiddleware, function(req, res) {
...
});
编辑另一种解决方案:
var mySpecialRoute = new express.Route('', '/api/users/:username');
app.use(function(req, res, next) {
if (mySpecialRoute.match(req.path)) {
// request matches your special route pattern
}
next();
});
但我不知道如何使用app.all()
作为'中间件'。
答案 1 :(得分:2)
只需像中间件的路由处理程序一样使用请求和响应对象,但如果您确实希望请求在中间件堆栈中继续,则调用next()
。
app.use(function(req, res, next) {
if (req.path === '/path') {
// pass the request to routes
return next();
}
// you can redirect the request
res.redirect('/other/page');
// or change the route handler
req.url = '/new/path';
req.originalUrl // this stays the same even if URL is changed
});
答案 2 :(得分:2)
您可以使用node-js url-pattern 模块。
制作模式:
var pattern = new UrlPattern('/stack/post(/:postId)');
将模式与网址路径匹配:
pattern.match('/stack/post/22'); //{postId:'22'}
pattern.match('/stack/post/abc'); //{postId:'abc'}
pattern.match('/stack/post'); //{}
pattern.match('/stack/stack'); //null
有关详细信息,请参阅:https://www.npmjs.com/package/url-pattern