1

デプロイされた API をAngularJSアプリと同じサーバーで実行しようとしていますが、デプロイされた APIがアプリのルーティングと競合しているようです。

デプロイされたサーバーはポート 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 に # がない) がデプロイによってハイジャックされているため、AngularJS によってルーティングされた '/foo' の URL が API にヒットし、「/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 でヒットしていないため、データが欠落しています。

どんな助けでも大歓迎です。

4

2 に答える 2

2

これは私の Expressserver.jsコードの問題であり、Deployd とは何の関係もないことがわかりました。メッセージが表示され続け、Cannot GET /fooDeployd がリソースを取得しようとしていると思い込んでいましたが、実際には 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 ルーターがハンドルを握ることができます。

于 2014-06-25T16:48:10.887 に答える