使用Express服务Angular App及其API

时间:2018-02-07 13:36:46

标签: angular express mod-rewrite apache2 reverse-proxy

我设置了一个具有此路由配置的Express应用程序:

app.use(express.static(path.join(__dirname, '../angular-app/dist')));
app.use('/', 
  express.Router().get('/', function(req, res, next) {
    res.redirect('index.html');
  })
);
app.use('/v1', v1); // these are my API routes

如果我启动此快速应用程序并在浏览器中导航到其根目录,则会出现Angular应用程序,但如果我导航到 Angular应用程序中的任何路径,例如/ mycomponent /我从Express获得404路由渲染。

我想要发生的是,任何不以/ v1开头的路由都会委托给角度应用,否则我的API就会被提供。这不是思考如何部署这对应用程序的合理方式吗?

为了解决这个问题,我使用反向代理配置托管在Apache服务器上。

   <Location /myapp>
      ProxyPass http://127.0.0.1:3000
      ProxyPassReverse http://1127.0.0.1:3000
   </Location>

...当然,我的角度应用在其index.html模板中有<base href="/myapp/"/>来支持此功能。所以我想知道“正确”执行此操作的唯一方法是使用Express应用程序的反向代理并让为API路由提供服务,然后在Apache中使用某种mod_rewrite配置直接从Apache托管Angular应用程序。你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

app.get('*', function(req, res, next) {
    res.sendFile(path.join(__dirname, '../angular-app/dist/index.html'));
});

将上述代码块放在routes中间件之前。

原因是Angular是一个SPA,这意味着它必须加载index.html所有相应的*.js,并在其中一个*.js中加载RouterModule您定义的Routes。在您通过键入domain/route导航到另一条路线时,或者在domain/route上刷新rootindex.html尚未加载Routes。因此,浏览器不知道Angular的l = [2, 5, 8, 10] r = 16 wanted = [] closest = 0 for i in l: for x in l: if l.index(x) == l.index(i): pass elif i+x == 16: print('Found') wanted = [i+x,[l.index(x),l.index(i)]] break else: if (i+x) < r: if i+x >= closest: closest = i+x print(closest) 定义。