express-subdomain处理任何子域

时间:2017-11-19 14:57:12

标签: javascript node.js express subdomain

我尝试在快递中使用https://github.com/bmullan91/express-subdomain进行子域路由。以下是我的main.js和src / routes / site文件的内容。

const express = require('express');
const bodyParser = require('body-parser');
const subdomain = require('express-subdomain');

const siteRouter = require('./src/routes/site');

const app = express()

app.use(express.json() );
app.use(express.urlencoded());
app.use(express.static('public'));
app.use(subdomain('*.www', siteRouter));

app.get('/', function(req, res) {
    res.send('Homepage');
});

const server = app.listen(80,'x3.loc', function () {
    var host = server.address().address;
    var port = server.address().port;
    console.log('X3 listening at http://%s:%s', host, port);
});


const express = require('express');

let router = express.Router();

router.get('/', function(req, res) {
    res.send('Welcome to site');
});

module.exports = router;

这种app.use(subdomain('*.www', siteRouter));的做法已在https://github.com/bmullan91/express-subdomain/issues/33中提出,但不起作用。

我也尝试过*作为子域名,但这导致主页没有子域名,也被视为一个对待。我怎么能让这个工作?

1 个答案:

答案 0 :(得分:1)

我们知道/匹配任何基本路径,无论子域名如何。所以我制作了你的主页中间件" subdomain-aware"像这样:

app.get('/', function(req, res,next) {
    /* If there are any subdomains, skip to next handler, since request is not for the main home page */
    if (req.subdomains.length > 0) {
        return next();
    }
    res.send('Homepage');
});

然后我将子域名的中间件放在主页中间件之下,如下所示:

app.use(subdomain('*', siteRouter));

这使得主页中间件可以为x3.loc和子域中间件提供服务,以便为api.x3.locapi.v1.x3.loc等任何子域提供请求。

但在我看来,真正的修复应该在模块中完成。我认为它应该被更改,以便处理req.subdomains为空的情况,或者*与实际字符串匹配,而不是跳过迭代。

令我感到惊讶的是,错误33中提出的解决方案对记者起作用了。在我的测试中,它以相反的方式工作,即www.example.com转到子域中间件,而stat1.example.com转到主页中间件。也许记者看到了这个并交换了中间件机构。