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

时间:2015-03-06 00:40:51

标签: 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;
}

问题在于,authRouter并不知道它实际上已安装在/admin下,因此它无法将其添加到callback参数中。

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

使用req.url

您可以使用req.url 如果您在http://example.com/test/here,则会返回/test/here

将其作为参数传递:

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

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

  // Setup auth routes
  var callbackUrl = baseUrl + '/oauth/callback';
  var loginUrl    = '/login';
  // ...
}

然后你会这样称呼它:

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

或者

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