【问题标题】:Running Angular Web App and NodeJS server together on same port?在同一个端口上同时运行 Angular Web App 和 NodeJS 服务器?
【发布时间】:2017-01-07 01:49:34
【问题描述】:

我使用 Yeoman 设置了一个基本的 angularjs Web 应用程序,我使用 Grunt 构建和运行该应用程序,并且我制作了一个基本的 nodejs 服务器,其中包含一些 angular 应用程序用来获取数据的端点。

但是我想在同一个端口上运行 Angular 应用程序和节点服务器,有没有什么方法可以在不使用 grunt servegrunt serve:dist 的情况下从我的节点服务器提供 Angular 应用程序?在从节点服务器提供之前,我是否仍然能够缩小我的 Angular 应用程序?

说明: 例如如果我去http://localhost/,它应该服务于角度应用程序,但是,如果我去http://localhost/api/xyz,它应该服务于节点端点。

【问题讨论】:

  • 角度应用应该是静态的。你不需要端口
  • 在这种情况下,节点如何识别角度定义的路线?
  • 我想用一个例子来解释你。 NodeJs 有一个路由GET /api/users。 AngularJS 想要调用路由,你可以使用 :GET <SERVER_URL>:<SERVER_PORT>/api/users 来实现。我更喜欢通过 ngnix(这是真正的静态)而不是 nodejs 来提供 Angular 应用程序。

标签: angularjs node.js gruntjs


【解决方案1】:

您可以执行以下操作。 文件夹结构

/
 /public
  /dist
   index.html
 /models
 /controllers
 server.js

server.js 是正常的 nodejs 服务器启动文件。
public/dist 文件夹是 Angular 的内置输出(由 ng build 提供)

在 server.js 文件中,首先定义所有 api 路由器,然后添加 * 路由以发送 index.html 文件

// Set our api routes
app.use('/api', api);     // <- define api end point

// Catch all other routes and return the index file
app.get('*', function(req, res) {
   res.sendFile(path.join(__dirname, 'dist/index.html'));
});

我在这里做的是,如果 url 类似于 http://localhost/api/xyz 那么它将在 api 路由器中命中。如果 url 不是 /api,它会将 index.html 文件发送到客户端。

注意:在浏览器中,您应该导航到 http://localhost/ 之类的内容,而不是 http://locahlost/api。通过 Angular 应用程序,您应该处理(重定向)未命中的路由器输入。

我想你明白了我的意思。如果您需要更多示例,请联系我,我会给您我的代码示例。

【讨论】:

  • 嗨@Viran Malaka,我需要有关 angular 2 和 node js 路由的帮助。我如何与您联系?
  • 谢谢我会发送好友请求:))
【解决方案2】:

但是我想在同一个端口上运行 Angular 应用程序和节点服务器,是否有某种方法可以在不使用 grunt servegrunt serve:dist 的情况下从我的节点服务器提供 Angular 应用程序?

您需要确保您是serving your angular app statically

如果我转到http://localhost/,它应该服务于角度应用程序,但是,如果我转到http://localhost/api/xyz,它应该服务于节点端点

要在同一台快速服务器上同时支持您的 API 和 Angular 应用程序,您应该使用 Router Middleware 将您的 Angular 应用程序与 API 分开。看看下面server.js/routes/api.js/routes/api/xyz.js 中的路由是如何构造的。

在从节点服务器提供 Angular 应用程序之前,我是否仍然能够缩小它?

是的,只需将缩小的 Angular 代码放入 /public/app 并将其设置为包含在您的 html 中。

示例布局

下面的代码是一个示例布局,展示了如何在同一个 express 实例中托管 API 的同时为您的 Angular 应用程序提供服务。

项目目录结构

/
  /public 
    /app
    /css
  /views
    index.html
  /routes
    api.js
    /api
      xyz.js
  server.js

server.js

var express = require('express');
var path = require('path');
var server = express();

// Check to see if ENV Variable PORT  is set, defaults to 1337
var port = process.env.PORT || 1337;
var apiRoutes = require('./routes/api.js');

// Sets up our view engine to load
server.set('views', path.join(__dirname, 'views'));
server.engine('html', require('ejs').renderFile);
server.set('view engine', 'html');

// This will serve anything with in /public as a static file
server.use(express.static(path.join(__dirname, 'public')));

// Creates /api section of site
// apiRoutes is an Express.Router() instance and contains
// all /api sub routes (ie. /api/xyz)
server.use('/api', apiRoutes);

// Send views/index.html to the client
// this contains the landing page for the angular app
server.get('/', function(req, res) {
  res.render('index');
});

// Listen for connections
server.listen(port, function() {
  console.log('Listening on ' + port);
});

/routes/api.js

var router = require('express').Router();
var xyzRouter = require('./api/xyz');

router.use('/xyz', xyzRouter);

module.exports = router;

/routes/api/xyz.js

var router = require('express').Router();

router.get('/', function(req, res) {
  // handle GET /api/xyz
});

module.exports = router;

【讨论】:

  • 这不是一件好事。快速支持 2500 次呼叫。如果您将静态应用程序放在 express (Nodejs) 中,则每个页面/js/css 都是一个调用(对于很多用户,您会锁定后端)。静态应用程序应该由 ngnix 或类似的东西提供服务,而不是来自 nodejs
  • @gianlucatursi 你在哪里收到每秒 2500 个电话的快递?每台机器的指标都不同。为什么不能缓存资源?静态文件可以由任何服务器(Apache、IIS 等)提供服务,但您绝对可以从 Express 提供服务,这是一种有效的用途。
  • 2500 这是一个例子(对不起,我之前没有指定)。从 express 提供静态文件是一种有效的用途,但我认为如果你在 Angular 中有一个“大”应用程序,其中包含很多库/文件,那么你可以以其他方式使用资源是一种浪费。
猜你喜欢
  • 1970-01-01
  • 2017-11-04
  • 2018-11-18
  • 2021-03-31
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2019-01-21
  • 2018-01-30
相关资源
最近更新 更多