从 node.js 服务器运行角度

Posted

技术标签:

【中文标题】从 node.js 服务器运行角度【英文标题】:Running angular from node.js server 【发布时间】:2015-10-23 02:45:50 【问题描述】:

我有以下文件 -

1) 索引.html

2) app.js(这里是角度控制器)

3) routes.js(我正在尝试从这里加载 index.html - 监听 localhost:3000)

4) 索引.css

5) node_modules 文件夹

routes.js:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server);

server.listen(3000);

app.use("/node_modules", express.static('node_modules'));        
app.use("/public", express.static('public'));

    app.get('/', function(req, res)
        res.sendFile(__dirname + '/index.html');
    );

io.sockets.on('connection', function(socket)
    socket.on('send message', function(data)
        io.sockets.emit('new message', data);
    );
);

当我通过从文件资源管理器中单击正常打开 index.html 文件时,它可以正常打开。

但是,当我运行 routes.js 以获取相同的 index.html 文件时,我得到了没有角度效果的原始 HTML。 这是为什么呢?

谢谢!

编辑:

我现在可以从 localhost:3000/public/ 访问我的 index.css 和 app.js。 我在routes.js 中使用了app.use("/public", express.static('public'));

但现在我的页面中只能包含css,但看起来仍然不包含 angular。我看不到标签。请看上面带有标签的index.html 文件的截图。

如何包含角度?它不是包含在 HTML 本身中的吗?

index.html -

<html>
...
...
<link href="node_modules/bootstrap-3.3.5-dist/css/bootstrap.min.css" rel="stylesheet"> 
<link href="public/index.css" rel="stylesheet"> 

<body>
...
...

<script src="node_modules/angular/angular.js"></script>
<script src="public/ui-bootstrap-tpls-0.13.1.js"></script>
<script src="node_modules/socket.io/node_modules/socket.io-client/socket.io.js"></script>
<script src="public/app.js"></script>

</body>
</html>

编辑: 我通过包含解决了它

app.use("/node_modules", express.static('node_modules'));

在我的 routes.js 文件中。所以现在 express 也使用该文件夹,因此该文件夹中的 angular 文件用于为我的 index.html 文件提供服务。 现在,运行我的localhost:3000/ 会给我预期的结果。谢谢!

【问题讨论】:

node_modules 是 nodejs 保存其模块的文件夹,angular.js 是一个 Web 应用程序框架,它不应该以任何方式放在 node_modules 中,对于 socker.io 客户端库也是如此,你应该采取它脱离了node_modules。同样在其他链接中重新公开,路径与我的示例中的磁盘上的文件夹不同,您应该将文件放在磁盘上的 public/javascript 文件夹中,但以 @teamnorge 感谢您的回复。我现在可以访问我的 js 和 css 文件。但是角度似乎不起作用。请看我编辑的问题。我正在使用并引用我下载的 angularJS 的本地副本,而不是链接到 CDN url。那是错的吗?纠正我! 拥有 angularjs 的本地副本没问题,只需将其放入适当的目录(在 public/javascript 中的某个位置),正如我上面提到的 node_modules 不是保存它的适当位置。 我解决了@teamnorge。只是按照相同的逻辑来提供静态文件。我还包括它以通过 app.use("/node_modules", express.static('node_modules')); 为我的“node_modules”服务。现在,该页面正在使用 Angular。感谢“teamnorge”坚持我的问​​题。我很乐意接受您的回答,请在您的回答中包含此内容 - app.use("/node_modules", express.static('node_modules'));。 对不起,我不会包含它,因为我不建议有一个到 node_modules 文件夹的路由,最好把你的 web 相关库从它里面取出并放在另一个文件夹中,在 expressjs 中也设置为静态. 【参考方案1】:

您的静态文件 (js/css) 似乎无法通过 expressjs 访问,您可以在浏览器控制台中查看是否为 404?

顺便问一下,您是在expressjs 中添加了app.js 以静态形式存储的目录,还是与index.html 位于同一目录中?

类似:

app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));

或者,您可以将路由添加到您的app.js

app.get('/js/app.js', function(req, res)
  res.sendFile(__dirname + '/app.js');
);

但不推荐,只是为了测试。

【讨论】:

app.js 与 index.html 位于同一目录中。我正在尝试按照您的建议包含 js 和 css 文件。 抱歉,我无法从 express 中加载这些文件,并且添加 app.js 也不起作用。 app.js 的控制器是空的。因此,添加或不添加它们应该没有太大区别。我在我的 HTML 中链接了 css 和 js 文件,所以我认为这不是问题。如果我错了,请纠正我。 那么,你看到css文件了吗?为简单起见,您可以创建一个文件夹 - public,将所有内容放在那里并指定 app.use(express.static(__dirname + '/public'));那么您的所有静态文件都必须可以从 / 访问 我按照你的建议做了。看起来我也无法访问我的公用文件夹。有什么帮助吗?我仍然得到相同的 HTML 页面,没有 CSS 和 Angular。【参考方案2】:

您正在运行您的节点服务器。

所以,您提到了静态文件(如 js、css)的路径。

为您的 app.js 定义路径,其中包括您的控制器。

假设您的app.js 位于根目录下的公用文件夹中,

然后在你的route.js中这样定义

app.use(express.static('public'));

【讨论】:

正如@teamnorge 所建议的那样。我使用了 app.use(express.static(__dirname + '/public'));将我的文件包含在 /public 文件夹中,但无济于事。我也无法从本地主机访问我的公用文件夹。请看我编辑的问题。 请告诉我您的 index.html 文件,其中包含您的脚本。 请看我的编辑。我在链接这些文件的地方包含了 sn-p。

以上是关于从 node.js 服务器运行角度的主要内容,如果未能解决你的问题,请参考以下文章

node简介

我是这样黑进你Node.js生产服务器的

Node.js简单介绍

你所未知的3种 Node.js 代码优化方式

如何使用备用配置从同一文件夹运行第二个node.js服务器

如何在 node.js 中以角度使用 socket.io?