2016-07-01 5 views
0

私は、Angular2でTypescriptを使用してログイン機能を持つ簡単なアプリケーションを定義しようとしています。私はルータを定義しましたが、ブラウザのURLにアクセスしようとするとエラーが発生しています。Angular2ルータが正しく動作しない

Cannot GET /login 

とURL私が使用しています:

http://localhost:3012/login 

ルータが正しく成分を補正するためにURLをルーティングされていないと私はなぜわからないかのように思えるこれは誤りです。

import {Component} from 'angular2/core'; 

import {ROUTER_DIRECTIVES, RouteConfig} from 'angular2/router'; 
import {LoginComponent} from './login/login.component'; 
import {DashboardComponent} from './dashboard/dashboard.component'; 

@Component({ 
    selector: 'home', 
    templateUrl: '<router-outlet></router-outlet>', 
    directives: [ROUTER_DIRECTIVES] 
}) 

@RouteConfig([ 
    {path: '/login', name: 'Login', component: LoginComponent, useAsDefault: true}, 
    {path: '/dashboard', name: 'Dashboard', component: DashboardComponent}, 
    {path: '/*other', name: 'Other', redirectTo: ['Login']} 
]) 
export class HomeComponent { 

} 

ログインし、ダッシュボードの両方のコンポーネントが正しく定義されているとPHPStormがエラーを拾っていない:ここでアプリやルータをインスタンス化し、私のhome.component.tsです。

これはどうして起こっているのでしょうか?

ここに私のサーバーサイドコードがあります。 server.ts(NodeJSエントリポイント)

import express = require('express'); 
import path = require('path'); 

let port: number = process.env.PORT || 3012; 
let app = express(); 

app.set('views', path.join('./src/Client/views')); 
app.set('view engine', 'ejs'); 
app.engine('html', require('ejs').renderFile); 

app.use("/node_modules", express.static(path.resolve(__dirname, '../../node_modules'))); 
app.use("/app", express.static(path.resolve(__dirname, '../Client/app'))); 

app.use("/*.html", function(req, res) { 
    res.render(req.params[0] + ".html"); 
}); 

app.get('/', function(req: express.Request, res: express.Response) { 
    res.render('index.html'); 
}); 

let server = app.listen(port, function() { 
    let host = server.address().address; 
    let port = server.address().port; 
}); 

そして、すべてのAngular2スクリプトを必要とSystemJS

<html> 
    <head> 
     <title>Test</title> 

     <script src="node_modules/es6-shim/es6-shim.min.js"></script> 
     <script src="node_modules/systemjs/dist/system-polyfills.js"></script> 
     <script src="node_modules/angular2/es6/dev/src/testing/shims_for_IE.js"></script> 

     <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script> 
     <script src="node_modules/systemjs/dist/system.src.js"></script> 
     <script src="node_modules/rxjs/bundles/Rx.js"></script> 
     <script src="node_modules/angular2/bundles/angular2.dev.js"></script> 
     <script src="node_modules/angular2/bundles/router.dev.js"></script> 
     <script src="node_modules/angular2/bundles/http.dev.js"></script> 
     <script> 
      System.config({ 
       packages: { 
        app: { 
         format: 'register', 
         defaultExtension: 'js' 
        } 
       } 
      }); 
      System.import('app/bootstrap') 
        .then(null, console.error.bind(console)); 
     </script> 
    </head> 

    <body> 
     <home>Loading...</home> 
    </body> 
</html> 

そして、私のファイル構造を開始含まれて私のindex.htmlファイル:

enter image description here

ありがとう

+0

ホストするのにどのサーバーを使用していますか?サーバーが '/ login'ディレクトリの内容を返そうとしているようです。 'lite-server'を使うと、これは問題にはなりません。また、 'HashLocationStrategy'に切り替えると、あなたのサーバは正しく評価される' http:// localhost:3012 /#/ login'になります。 –

+0

あなたはどんなバージョンですか? – wolfhoundjesse

+0

すぐにお返事ありがとうございます。カスタムNodeJSサーバーを使用しています。私はNodeJSレイヤーを完全に制御したいのでlite-serverを使いたくありません。ルータが正しく動作していたので、これが問題であるとは思えません。 – devoncrazylegs

答えて

1

私はこれを考える:私はあなたが+ htmlの要求に再び.htmlのなぜわからないので

app.use("/*.html", function(req, res) { 
    res.render(req.params[0] + ".html"); 
}); 

app.use("/*", function(req, res) { 
    res.render(req.params[0] + ".html"); 
}); 

でなければなりません。

これで問題は解決しますか?

+0

修正!ありがとう!どうしてこのことがうまくいったのですか?どうもありがとうございます – devoncrazylegs

+0

*はどんな経路を与えるでしょう。だから、 'a/b/c'でも構いませんが、最初のインデックス([0])だけを取得しています。前の例では 'a'になります。そして、あなたのファイル組織から、 '/ login'は' login.html'に関連するはずだと思いました。したがって、 '.html'は既に' + '.html'の中に追加されているので、あなたの '.use'メソッドにあってはならないと結論づけました。私はあなたの疑問に答えることを願っています。 – 82Tuskers

0

私はルータのニーdsはベースhrefを設定して、相対的なルーティング先を知るようにします。

Angular 2 router no base href set

+0

ベースhrefを設定しましたが、問題をソートしていないようです。私は私のファイル構造を示すことが良いアイデアかもしれないと思うので、私はそれを追加しました。 – devoncrazylegs

+0

私が構築しているAngular2アプリケーションは、ファイル構造内のこの場所にあります。src/Client/app。それは根に座っていません。これがベースhrefを設定するために必要なものに影響しますか? – devoncrazylegs

関連する問題