是否可以获取快速路由器的基本URL

Fot*_*ios 6 node.js express

我有一个身份验证中间件,需要调用外部服务并提供回调URL.例如:

var express = require('express');
var app = express();

// This will work just fine
app.use('/', getAuthRouter());

// The redirects here will end up going to /oauth/callback 
//    instead of /admin/oauth/callback
app.use('/admin', getAuthRouter());

function getAuthRouter() {
  var authRouter = express.Router();

  // Setup auth routes
  var callbackUrl = '/oauth/callback';
  var loginUrl    = '/login';

  authRouter.get(callbackUrl, .... });
  authRouter.get(loginUrl, function(req, res, next){
    // Make call to OAuth server
    res.redirect("http://authserver/?callback=" + callbackUrl);
  });

  return authRouter;
}
Run Code Online (Sandbox Code Playgroud)

问题是,authRouter它不知道它实际上是在下面安装的,/admin所以它无法将它添加到callback参数中.

有什么方法可以让我在getAuthRouter函数内部得到它吗?

小智 5

使用专为此用例设计的request.baseUrl.


Tel*_*kis 3

使用req.url

您可以使用req.url
如果你在的话http://example.com/test/here它就会回来/test/here

将其作为参数传递:

但在您的情况下,您也可以将基本网址作为中间件的参数传递:

function getAuthRouter(baseUrl) {
  var authRouter = express.Router();
  baseUrl = baseUrl || ""; // Default

  // Setup auth routes
  var callbackUrl = baseUrl + '/oauth/callback';
  var loginUrl    = '/login';
  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后你会这样称呼它:

app.use('/admin', getAuthRouter("/admin"));

或者

app.use ('/', getAuthRouter()); // Calls default