我习惯使用httpd(Apache),它提供了一种配置映射到目录的子域的方法。 我如何在Connect.js / Express.js中做同样的事情?我看到我唯一拥有的是路由,我不知道如何使用它来配置子域。我有子域名,如m.mysite.com,sync.mysite.com
有人可以帮忙吗?
答案 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