如何在 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)

我在问题本身就有了问题的答案