如何在 Express.JS 中获取下一个中间件函数的名称
How to get name of next middleware function in Express.JS
我正在尝试获取特定请求路由中的中间件函数的名称。
假设我实现了以下代码:
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
中间件能够在堆栈中获取下一个要调用的中间件函数的名称。
比如,如果有 GET
请求 "/users"
,我希望 nextFunctionName
具有 "getUsers"
或“controller.getUsers”的值或相似的东西。
或者 GET "/users/:id/posts"
有相同的 nextFunctionName
是 "getUserPosts"
之类的。
我该怎么做?
我对 Express 和 Node 甚至 javascript 还是个新手。我该怎么做?
我知道这是可能的,因为在 javascript.
中已经有一种方法可以将函数名称作为字符串获取
someFunction.name // gives "someFunction" returned as a string
所以我知道这是可以做到的。我只是不知道,如何。
P.S。我知道有其他方法可以达到预期的效果,但我对此的需求并没有完全反映在上面的代码片段中,但我尽力展示了它。
你不想做那么动态的事情,保持简单。为什么不这样做:
const nextFunctionName = (user)=>{
// blah blah blah (something synchronous not asynchronous)
}
const authorizeRoute = (req,res,next) => {
if (isUserAuthorized(req.user?.id)){
nextFunctionName(req.user)
}
next()
}
但看起来您实际上只是想这样做:
const nextFunctionName = (user, next)=>{
// blah blah blah
next();
}
const authorizeRoute = (user, next) => {
if (isUserAuthorized(user.id)){
nextFunctionName(user, next); // pass in the next callback
} else {
next()
}
}
明白了。我无法使用 app.use
放置中间件来获取路由的堆栈,但如果将中间件放置在路由的处理程序中,它将起作用。
const SomeFunctionToRetrieveTheNameOfTheLastMiddleware(req) => {
let stack = req.route.stack
return stack[stack.length-1].name
}
const authorizeRoute = (req,res,next) => {
let nextFunctionName = SomeFunctionToRetrieveTheNameOfTheLastMiddleware(req)
if (isUserAuthorized(req.user.id, nextFunctionName)) next()
}
app.get("/users", authorizeRoute, controller.getUsers)
app.get("/users/:id/posts", authorizeRoute, controller.getUserPosts)
我在问题本身就有了问题的答案
我正在尝试获取特定请求路由中的中间件函数的名称。 假设我实现了以下代码:
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
中间件能够在堆栈中获取下一个要调用的中间件函数的名称。
比如,如果有 GET
请求 "/users"
,我希望 nextFunctionName
具有 "getUsers"
或“controller.getUsers”的值或相似的东西。
或者 GET "/users/:id/posts"
有相同的 nextFunctionName
是 "getUserPosts"
之类的。
我该怎么做?
我对 Express 和 Node 甚至 javascript 还是个新手。我该怎么做?
我知道这是可能的,因为在 javascript.
中已经有一种方法可以将函数名称作为字符串获取someFunction.name // gives "someFunction" returned as a string
所以我知道这是可以做到的。我只是不知道,如何。
P.S。我知道有其他方法可以达到预期的效果,但我对此的需求并没有完全反映在上面的代码片段中,但我尽力展示了它。
你不想做那么动态的事情,保持简单。为什么不这样做:
const nextFunctionName = (user)=>{
// blah blah blah (something synchronous not asynchronous)
}
const authorizeRoute = (req,res,next) => {
if (isUserAuthorized(req.user?.id)){
nextFunctionName(req.user)
}
next()
}
但看起来您实际上只是想这样做:
const nextFunctionName = (user, next)=>{
// blah blah blah
next();
}
const authorizeRoute = (user, next) => {
if (isUserAuthorized(user.id)){
nextFunctionName(user, next); // pass in the next callback
} else {
next()
}
}
明白了。我无法使用 app.use
放置中间件来获取路由的堆栈,但如果将中间件放置在路由的处理程序中,它将起作用。
const SomeFunctionToRetrieveTheNameOfTheLastMiddleware(req) => {
let stack = req.route.stack
return stack[stack.length-1].name
}
const authorizeRoute = (req,res,next) => {
let nextFunctionName = SomeFunctionToRetrieveTheNameOfTheLastMiddleware(req)
if (isUserAuthorized(req.user.id, nextFunctionName)) next()
}
app.get("/users", authorizeRoute, controller.getUsers)
app.get("/users/:id/posts", authorizeRoute, controller.getUserPosts)
我在问题本身就有了问题的答案