在同一台服务器上运行deployd和angular.js应用程序

时间:2014-05-21 15:54:27

标签: javascript angularjs node.js url-routing deployd

我正在尝试在与deployd应用相同的服务器上运行AngularJS API,但deployd似乎与应用路由冲突。

我的deployd服务器正在侦听端口5000,看起来像这样:

var deployd = require('deployd');

var server = deployd({
    port: process.env.PORT || 5000,
    env: 'production',
    db: {
        host: 'localhost',
        port: 27017,
        name: 'deployd',
        credentials: {
            username: 'myUsername',
            password: 'myPassword'
        }
    }
});

server.listen();

server.on('listening', function() {
    console.log("Server is listening");
});

server.on('error', function(err) {
    console.error(err);
    process.nextTick(function() { // Give the server a chance to return an error
        process.exit();
    });
});

我的AngularJS应用程序的节点服务器正在侦听端口3000,如下所示:

var express = require('express');
var app = express();

app.use(express.static(__dirname + '/public'));

app.listen(process.env.PORT || 3000);

该应用加载正常,但在拨打电话时没有像预期的那样点击API:

$http.get('localhost:5000/foo')

或者这个:

$http.get('http://my.public.ip.address:5000/foo')

我的页面路由(在HTML5模式下,URL中没有#)被deployd劫持 - 因此AngularJS为'/ foo'路由的URL正在访问API并返回“Can not GET / foo”。

这一切都发生在同时运行Apache的服务器上,但是配置为使用以下内容将我的域的请求转发到端口3000:

NameVirtualHost *:80
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName my.domain.com

        ProxyPreserveHost       on
        ProxyPass /             http://localhost:3000/

        <Location />
          Order allow,deny
          Allow from all
        </Location>
</VirtualHost>

如果我在URL中使用#,例如http://my.domain.com/#/foo将返回由AngularJS路由器指定的页面模板,但它缺少数据,因为API未在端口5000上被点击。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

原来这是我的Express server.js代码的问题,与Deployd无关。我一直看到Cannot GET /foo消息,只是假设Deployd正在尝试获取资源,但实际上Express没有加载index.html(它加载AngularJS和我的路由代码),因为它只是试图加载静态而是名为foo的文件。

这是我固定的server.js

var express = require('express');
var app = express();

app.use(express.static(__dirname + '/public'));
app.use(function(req, res) {
    res.sendfile(__dirname + '/public/index.html');
});

app.listen(process.env.PORT || 3000);

现在,如果静态文件foo不存在,它会加载index.html并允许我的AngularJS路由器开启。

答案 1 :(得分:0)

您是否从浏览器检查过端口3000以及5000是否可以访问?

因为您正在使用代理传递,所以我认为这些端口未打开。因为angular是在客户端运行的,所以如果5000端口关闭,它将永远无法连接到api。