如何在Express.js或Connect.js中配置多个子域

时间:2011-04-26 13:43:39

标签: node.js express subdomain connect.js

我习惯使用httpd(Apache),它提供了一种配置映射到目录的子域的方法。 我如何在Connect.js / Express.js中做同样的事情?我看到我唯一拥有的是路由,我不知道如何使用它来配置子域。我有子域名,如m.mysite.com,sync.mysite.com

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:113)

或者您可以使用vhost

然后,在他们自己的目录中创建几个站点并导出快速应用程序,例如。 /path/to/m/index.js

var app = express()
/* whatever configuration code */
exports.app = app
// There is no need for .listen()

然后使用以下应用处理所有请求:

var vhost = require('vhost');

express()
.use(vhost('m.mysite.com', require('/path/to/m').app))
.use(vhost('sync.mysite.com', require('/path/to/sync').app))
.listen(80)

请注意,/path/to/m/path/to/sync可以是绝对路径(如上所述)或相对路径。

答案 1 :(得分:18)

您可以将子域附加到请求中,然后在后续next()次调用中检查它。

我从>获得了以下代码http://groups.google.com/group/express-js/browse_thread/thread/b04bbaea7f0e8eed(完全归功于原作者)

app.get('*', function(req, res, next){ 
  if(req.headers.host == 'some.sub.domain.com')  //if it's a sub-domain
    req.url = '/mysubdomain' + req.url;  //append some text yourself
  next(); 
});

// This will mean that all get requests that come from the subdomain will get 
// /subdomain appended to them, so then you can have routes like this 
app.get('/blogposts', function(){ 
  // for non-subdomain 
});

app.get('/mysubdomain/blogposts', function(){ 
   // for subdomain 
});

答案 2 :(得分:14)

我最近遇到过这个问题,并编写了一个模块来帮助使用express 4. https://www.npmjs.org/package/express-subdomain

示例 - api子域。

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

var router = express.Router();

//api specific routes
router.get('/', function(req, res) {
   res.send('Welcome to our API!');
});

router.get('/users', function(req, res) {
    res.json([
        { name: "Brian" }
    ]);
});

app.use(subdomain('api', router));
app.listen(3000);

在npm上查看模块以查看更多示例。

答案 3 :(得分:6)

我创建了一个模块来帮助Express:https://github.com/WilsonPage/express-subdomain-handler

中的子域

答案 4 :(得分:0)

按我说的做,在不同的文件夹中创建两个Express应用程序。

例如: / blogsite目录中的一个应用

const express = require("express");

const blog = express();

blog.get("/", (req, res) => {
	res.send("BLOG SECTION");
});

blog.get("/allblogs", (req, res) => {
	res.json([
		{ title: "csgo major boston", description: "Best CSGO major ever" },
		{ title: "Blast pro series", description: "Coolest series of CSGO" },
	]);
});

module.exports = { blog };

和/ portfolio目录中的另一个

const express = require("express");

const portfolio = express();

portfolio.get("/", (req, res) => {
	res.send("PORTFOLIO SECTION");
});

portfolio.get("/resume", (req, res) => {
	res.send("HERE'S MY RESUME");
});

module.exports = { portfolio };

现在在外部文件夹中创建一个主应用程序,然后导入您刚在/ blogsite目录和/ portfolio目录中创建的其他两个快速应用程序。

然后在主应用中执行此操作

const express = require("express");
const vhost = require("vhost");

const { blog } = require("./blogsite");
const { portfolio } = require("./portfolio");

const app = express();

// BLOG AND PORTFOLIO

// url: http://blog.localhost:3002/
// url: http://blog.localhost:3002/allblogs

// url: http://portfolio.localhost:3002/
// url: http://portfolio.localhost:3002/resume

app
	.use(vhost("portfolio.localhost", portfolio))
	.use(vhost("blog.localhost", blog));

// MAIN APP ROUTES OR ENDPOINTS

// url: http://localhost:3002
// url: http://localhost:3002/myhobbies

app.get("/", (req, res) => {
	res.send("MAIN APP SECTION");
});

app.get("/myhobbies", (req, res) => {
	res.send("MAIN APP -> myhobbies section");
});

app.listen(3002, () => {
	console.log("started listening");
});

fileStructure结尾应该看起来像这样

main(folder)
  index.js (main express app which you need to run using node or nodemon)
  blogsite(folder that I talked about for blog.localhost)
    index.js (blog express app)
  portfolio(folder)
    index.js (portfolio express app)

答案 5 :(得分:0)

我对我正在从事的项目有完全相同的要求,并最终将基于中间件的解决方案放在一起。它允许您定义路由器并查看每个子域的文件夹。

在 NPM https://www.npmjs.com/package/express-multiview 上查看 或 GitHub https://github.com/daryl-cecile/express-multi-view#readme