【发布时间】:2021-11-04 04:13:04
【问题描述】:
我正在尝试获取特定请求路由中的中间件函数的名称。 假设我实现了以下代码:
const authorizeRoute = (req,res,next) => {
let nextFunctionName = SomeFunctionToRetrieveTheNameOfTheNextMiddlewareToBeCalled()
if (isUserAuthorized(req.user.id, nextFunctionName)) next()
}
app.use(authorizeRoute)
app.get("/users", controller.getUsers)
app.get("/users/:id/posts", controller.getUserPosts)
我希望authorizeRoute 中间件能够获取堆栈中下一个要调用的中间件函数的名称。
例如,如果有 "/users" 的 GET 请求,我希望 nextFunctionName 具有 "getUsers" 或“controller.getUsers”或类似的值。
或者GET "/users/:id/posts" 具有相同的nextFunctionName 以成为"getUserPosts" 或其他东西。
我该怎么做?
我还是 Express 和 Node 甚至 javascript 的新手。我该怎么做呢?
我知道这是可能的,因为已经有一种方法可以在 javascript 中将函数名作为字符串获取。
someFunction.name // gives "someFunction" returned as a string
所以我知道这是可以做到的。我只是不知道,如何。
附:我知道有其他方法可以达到预期的效果,但我对此的需求并没有完全反映在上面的 sn-p 中,但我尽力让它展示出来。
【问题讨论】:
-
那么,您尝试
next.name了吗?但我不认为next实际上是下一个中间件,而是 express 提供的一个包装器。 -
@Bergi next.name 将“next”作为字符串。除了。 next() 不直接调用 next 中间件函数。它还有其他功能,我对此一无所知。
-
你真的不应该使用函数名来选择授权。相反,将它明确地提供给路线 - 这也将通过许多不同的路线更好地扩展:
app.get("/users", authorizeRoute("users"), controller.getUsers); app.get("/users/:id/posts", authorizeRoute("posts"), controller.getUserPosts); -
我知道这是一种方法。但是已经有一个数据库来控制对每条路线的访问。就像我说的。 sn-p 并不能完全说明我为什么需要它;只是什么。
-
那么你为什么需要它呢?你想要的可能是不可能的。
标签: javascript express middleware