如何拦截 node.js express 请求

31
在Express中,我定义了一些路由。
app.post("/api/v1/client", Client.create);
app.get("/api/v1/client", Client.get);
...

我已经定义了如何在Client控制器内处理请求。是否有一种方法可以在我的控制器中处理请求之前对其进行预处理?具体来说,我想检查API调用者是否被授权访问该路由,使用访问级别的概念。任何建议都将不胜感激。


把connect/express想象成一个拥有许多手的按摩师,每只手都是一个中间件,将您的请求按摩成正确的响应。所以Ryan Olds说的100%正确。 ;) - Pickels
1个回答

69

你可以用几种方式来实现你需要的功能。

这将会放置一个中间件在路由之前被使用。确保路由使用app.use()添加。中间件的顺序很重要。

app.use(function(req, res, next) {
  // Put some preprocessing here.
  next();
});
app.use(app.router);

你也可以使用路由中间件。

var someFunction = function(req, res, next) {
  // Put the preprocessing here.
  next();
};
app.post("/api/v1/client", someFunction, Client.create);

这将对该路由执行预处理步骤。

注意:确保您的app.use()调用在路由定义之前。定义路由会自动将app.router添加到中间件链中,这可能会使其位于用户定义的中间件之前。


@ryan-olds,我该如何检查“Content-Type”?我只需要在JSON响应中设置到期时间,而不是所有响应。 - Manish Sapkal
这是一个简单的拦截概念。你是否熟悉更通用、形成的方法来做到这一点?谢谢。 - Roi Shabtai
我想知道是否有任何方法可以做到这一点,并且还能检查请求体。http://stackoverflow.com/questions/35164808/unobtrusive-middle-ware-for-expres-js-to-inspect-request-body - jpierson
1
有,但是body解析器需要在堆栈/中间件中较早的位置。 - Ryan Olds
对于你的第一个解决方案,“app.use(app.router);”不再需要(并且会导致过时的异常)。只需将其删除,它就完美了。 - user3617487
app.router已被弃用。 - Viraj Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接