我是想搭这么个环境:
前端开发人员通过git clone下代码后,使用
npm install
node web-server.js
几个简单的命令就能工作,不需要其他东西,前后端分离。
后端用java写部署在其他地方,这样要求前端的serlvet请求转发到java服务器上。
直接上配置文件,这是最终的结果,简单漂亮,但为了得到这么漂亮的结果,整整花了我一天的时间。
var express = require("express");
var proxy = require("express-http-proxy");
var app = express();
var port = 8088;
var apiProxy = proxy("localhost:8080",{
forwardPath:function(req,res){
return req._parsedUrl.path
}
})
app.use("/restapi/*",apiProxy);
app.use("/admin/*",apiProxy);
app.use("*.xls",apiProxy);
app.use(express.static('src'));
app.listen(port);
console.log('Now serving the app at http://localhost:'+port);
官网[1]给的例子如下,用的是req.url。
var proxy = require('express-http-proxy');
var app = require('express')();
app.use('/proxy', proxy('www.google.com', {
forwardPath: function(req, res) {
return require('url').parse(req.url).path;
}
}));
然后当我使用app.use('/api/*',proxy)的时候,express把req.url匹配部分全部截去了,因此得到的一直是‘/’。苦恼了我好久。
按照官网的意思,应该用app.use('/',proxy),然后使用filter来进行匹配。
app.use('/proxy', proxy('www.google.com', {
filter: function(req, res) {
return req.url.indexOf('/api/') == 0;
},
forwardPath: function(req, res) {
return require('url').parse(req.url).path;
}
}));
但是当需要匹配多个url后,filter写起来比较繁琐,因此最终使用req._parsedUrl.path。
参考资料:
[1] express-http-proxy官网 https://github.com/villadora/express-http-proxy