4

基本的に、キャッチオール ルートを使用しres.redirect('/')、入力した URL に関係なく使用すると、常にインデックス/ホームページがレンダリングされます (つまり、Angular は完全な URL を「参照」していないようです)。ただしres.render('index')、キャッチオール ルートに配置するとすべて正常に動作します。コードを繰り返したくないので、「/」へのリダイレクトは機能するはずです。おそらくここのどこかで愚かな間違いを犯したので、助けていただければ幸いです。

角度ルーティング:

app.config(function ($routeProvider, $locationProvider) {
$locationProvider.html5Mode(true);

$routeProvider
    .when('/', 
        {   
            templateUrl: 'partials/home.jade'
        })
    .when('/about', 
        {
            templateUrl: 'partials/about.jade'
        })
    .otherwise( {redirectTo: '/'});
});

これにより、入力時に about ページが正しくレンダリングされますsite-address/about

app.get('/', function (req, res) {
    res.render('index');
});

app.get('/partials/:name', function (req, res) {
    res.render('partials/' + req.params.name);
});

app.get('*', function (req, res) {
    res.render('index');
});

これは常にインデックスページだけを表示します:

app.get('/', function (req, res) {
    res.render('index');
});

app.get('/partials/:name', function (req, res) {
    res.render('partials/' + req.params.name);
});

app.get('*', function (req, res) {
    res.redirect('/');
});

それが役立つ場合の設定:

// Configuration
app.configure(function () {
    app.set('port', process.env.PORT || 1337);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(app.router);
});
4

4 に答える 4

3

これは仕様によるものです。

を使用するres.redirect('/')と、Node/Express は HTTP リダイレクトを送信します。これにより、ブラウザーの URL が変更されます。したがって、インデックス テンプレートがレンダリングされ、Angular コードが実行されると/、ユーザーが何を入力したかに関係なく、URL は になります (リダイレクトのポイント全体)。

リダイレクトを省略してテンプレートのみを応答として送信すると、NodeJs は HTML コンテンツとともに HTTP 200 (成功) で応答します。URL が変更されていないため、アプリケーションを実行すると、Angular ルーティングが適切にルーティングされます。

編集して追加: アドレス コメント

2 つのルートで同じテンプレートをレンダリングするのではなく、/ルートをまとめて削除し、キャッチオールでインデックス テンプレートをレンダリングするだけで、制御が Angular ルーターに渡されます。

それ以外の場合は、ルートを概念的に分割することを検討します。すべてのアプリケーション ルートは明確に angular ルーターに送信され、nodejs を介して静的ルートをレンダリングし、キャッチ オールを使用して欠落または不明なリソースにより適切なページをレンダリングします (より役立つあなたのユーザー)。

正規表現に似た言語を使用して、単一のハンドラーを指定できます。

app.get('/()|(about)|(contact)/',function(req,res) {/* handle */});
于 2013-10-14T23:07:55.217 に答える
1

キャッチオール ルーティングを使用すると、すべての静的アセット (スタイルシート、JavaScript ファイルなど) が読み込まれないという問題があります。

app.use(app.router);   
app.use(express.static(path.join(__dirname, frontend.app)));

// when this is removed, I can load static assets just fine
app.get('*', function(req, res){
  res.render('main');
});

app.get('*', ...) 部分が削除されると、静的アセットを問題なくロードできます (つまり、「examplejavascript.js」と入力して JavaScript ファイルを表示できます。ただし、そこにある場合は、expressアセットをキャッチします。

于 2013-10-29T07:34:13.927 に答える
0

$locationProvider.html5Mode(true); リクエストがnodejsサーバーに届いていると確信していますか。この手段を使用して、angularjs はブラウザー内で urlmapping を検索しようとします。

$locationProvider.html5Mode(true); にコメントしてみてください。

于 2014-02-04T14:16:16.700 に答える