Nodejs - Express 服务器上的 BrowserSync 运行
Nodejs - BrowserSync running on express server
我想从数据库中提取一个 URL 并将其用作代理 URL。然而,我提出的设置使用递增的端口号为每个 URL 初始化了一个新的 BrowserSync 服务器。
有没有办法不用每次都初始化一个新的 BrowserSync 服务器就可以做到这一点?
或者我应该使用其他方法吗?
var bs = require("browser-sync");
var express = require("express");
var router = express.Router();
var app = express();
router.get("/", function(req, res){
var proxyUrl = getUrl() //get url from db (www.example.com)
bs.create("bs1").init({
notify: false,
open: false,
ui: false,
port: 10000,
proxy: proxyUrl
});
res.send();
});
app.use(router);
app.listen(8080, function(){
console.log('listening on *:8080');
});
以上很好(大概)但是为每个 URL(可能是数千个)初始化一个新服务器是好的做法吗?
向系统的每个用户公开一个新的端口号是否安全? (我可以用子域屏蔽它吗?)
更新
我的最终目标是使用唯一的子域来引用每个代理 url。
例如:
sub1.mysite.com 代理 www.example.com,
sub2.mysite.com 代理 www.example2.com
也许我误解了你想做什么,但 Browsersync 和 express 在这种情况下似乎有点矫枉过正,为什么不将 node-http-proxy 与本机 http 模块一起使用?
var http = require('http')
var httpProxy = require('http-proxy')
var options = ...
var proxy = httpProxy.createProxyServer(options)
var server = http.createServer(function (req, res) {
var proxyUrl = getUrl()
proxy.web(req, res, { target: proxyUrl })
})
server.listen(8080, function () {
console.log('listening on *:8080')
})
浏览器同步将不起作用,因为代理与服务器设置相关。
我使用以下软件包:
- 快递
- express-http-proxy
- 虚拟主机(表示虚拟主机)
const port = 8080;
var app = require('express')();
var proxy = require('express-http-proxy');
var url = require('url');
var vhost = require('vhost');
app.listen(port);
/* Assuming getUrl() will return an array of sites */
// var sites = getUrl();
// DO NOT put '/' at the end of site
var sites = [
'http://www.bing.com',
'http://samanthagooden.com',
'http://www.courtleigh.com'
];
var i = 0;
sites.forEach(site => {
i++;
var subDomain = 'sub' + i + '.mysite.com';
app.use(vhost(subDomain, proxy(site, {
forwardPath: (req, res) => url.parse(req.url).path,
intercept: (rsp, data, req, res, callback) => {
if (res._headers['content-type']) {
var contentType = res._headers['content-type'];
if (
contentType.indexOf('text') !== -1 ||
contentType.indexOf('javascript') !== -1
) {
// Replace link if content-type = text or javascript
var reg = new RegExp(site, 'g');
res.send(data.toString().replace(reg, ''));
} else {
res.send(data);
}
} else {
res.send(data);
}
}
})));
console.log(subDomain + ':' + port + ' proxy: ' + site);
});
以上示例将创建以下代理:
sub1.mysite.com:8080 proxy: www.bing.com
sub2.mysite.com:8080 proxy: www.example.com
根据我的说法,如果您希望使用代理的 SAAS 服务不是一个好主意,那么我的想法是..如果您要为每个客户端使用代理,将使用新端口创建进程...我的解决方案是使用 listen localhost 创建节点服务器并将 *.domain.com 映射到服务器..
如果您为每个客户端使用单独的数据库:-
在节点逻辑中从请求主机获取 cname 并使用该引用连接数据库。
最终控制器代码将是..
var express = require('express');
var router = express.Router();
var MongoClient = require('mongodb').MongoClient;
/* GET home page. */
router.get('/', function(req, res, next) {
var client = req.subdomains[0];
console.log(client);
MongoClient.connect('mongodb://localhost:27017/'+client, function(err, db) {
if (err) {
throw err;
}
db.collection('app1').find().toArray(function(err, result) {
if (err) {
throw err;
}
console.log('data');
console.log(result);
});
});
res.render('index', { title: 'Express' });
});
module.exports = router;
~
~
将来如果您获得更多客户端,您可以使用 webservice
实施节点集群或标准 Ubuntu 集群
我想从数据库中提取一个 URL 并将其用作代理 URL。然而,我提出的设置使用递增的端口号为每个 URL 初始化了一个新的 BrowserSync 服务器。
有没有办法不用每次都初始化一个新的 BrowserSync 服务器就可以做到这一点?
或者我应该使用其他方法吗?
var bs = require("browser-sync");
var express = require("express");
var router = express.Router();
var app = express();
router.get("/", function(req, res){
var proxyUrl = getUrl() //get url from db (www.example.com)
bs.create("bs1").init({
notify: false,
open: false,
ui: false,
port: 10000,
proxy: proxyUrl
});
res.send();
});
app.use(router);
app.listen(8080, function(){
console.log('listening on *:8080');
});
以上很好(大概)但是为每个 URL(可能是数千个)初始化一个新服务器是好的做法吗?
向系统的每个用户公开一个新的端口号是否安全? (我可以用子域屏蔽它吗?)
更新
我的最终目标是使用唯一的子域来引用每个代理 url。
例如:
sub1.mysite.com 代理 www.example.com,
sub2.mysite.com 代理 www.example2.com
也许我误解了你想做什么,但 Browsersync 和 express 在这种情况下似乎有点矫枉过正,为什么不将 node-http-proxy 与本机 http 模块一起使用?
var http = require('http')
var httpProxy = require('http-proxy')
var options = ...
var proxy = httpProxy.createProxyServer(options)
var server = http.createServer(function (req, res) {
var proxyUrl = getUrl()
proxy.web(req, res, { target: proxyUrl })
})
server.listen(8080, function () {
console.log('listening on *:8080')
})
浏览器同步将不起作用,因为代理与服务器设置相关。
我使用以下软件包:
- 快递
- express-http-proxy
- 虚拟主机(表示虚拟主机)
const port = 8080;
var app = require('express')();
var proxy = require('express-http-proxy');
var url = require('url');
var vhost = require('vhost');
app.listen(port);
/* Assuming getUrl() will return an array of sites */
// var sites = getUrl();
// DO NOT put '/' at the end of site
var sites = [
'http://www.bing.com',
'http://samanthagooden.com',
'http://www.courtleigh.com'
];
var i = 0;
sites.forEach(site => {
i++;
var subDomain = 'sub' + i + '.mysite.com';
app.use(vhost(subDomain, proxy(site, {
forwardPath: (req, res) => url.parse(req.url).path,
intercept: (rsp, data, req, res, callback) => {
if (res._headers['content-type']) {
var contentType = res._headers['content-type'];
if (
contentType.indexOf('text') !== -1 ||
contentType.indexOf('javascript') !== -1
) {
// Replace link if content-type = text or javascript
var reg = new RegExp(site, 'g');
res.send(data.toString().replace(reg, ''));
} else {
res.send(data);
}
} else {
res.send(data);
}
}
})));
console.log(subDomain + ':' + port + ' proxy: ' + site);
});
以上示例将创建以下代理:
sub1.mysite.com:8080 proxy: www.bing.com
sub2.mysite.com:8080 proxy: www.example.com
根据我的说法,如果您希望使用代理的 SAAS 服务不是一个好主意,那么我的想法是..如果您要为每个客户端使用代理,将使用新端口创建进程...我的解决方案是使用 listen localhost 创建节点服务器并将 *.domain.com 映射到服务器..
如果您为每个客户端使用单独的数据库:- 在节点逻辑中从请求主机获取 cname 并使用该引用连接数据库。
最终控制器代码将是.. var express = require('express'); var router = express.Router(); var MongoClient = require('mongodb').MongoClient;
/* GET home page. */
router.get('/', function(req, res, next) {
var client = req.subdomains[0];
console.log(client);
MongoClient.connect('mongodb://localhost:27017/'+client, function(err, db) {
if (err) {
throw err;
}
db.collection('app1').find().toArray(function(err, result) {
if (err) {
throw err;
}
console.log('data');
console.log(result);
});
});
res.render('index', { title: 'Express' });
});
module.exports = router;
~
~
将来如果您获得更多客户端,您可以使用 webservice
实施节点集群或标准 Ubuntu 集群