我有一个身份验证中间件,需要调用外部服务并提供回调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
函数中得到它吗?
答案 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