静的ディレクトリからAngularJSをロードするExpressを使用しています。通常、http://localhost/
を要求します。Expressでは、index.html
および正しいAngularファイルなどすべてが提供されます。Angularアプリでは、これらのルートをセットアップしています、ng-view
のコンテンツを置き換えます:
$routeProvider.when('/', {
templateUrl: '/partials/main.html',
controller: MainCtrl,
});
$routeProvider.when('/project/:projectId', {
templateUrl: '/partials/project.html',
controller: ProjectCtrl,
});
$locationProvider.html5Mode(true);
メインページには、<a href="/project/{{project.id}}">
へのリンクがあります。これにより、テンプレートが正常に読み込まれ、http://localhost/project/3
または指定した任意のIDに移動できます。問題は、ブラウザーをhttp://localhost/project/3
にリダイレクトするか、ページを更新しようとすると、リクエストがCannot GET /project/3
を返すExpress/Nodeサーバーに送られることです。
これに対応するためにエクスプレスルートを設定するにはどうすればよいですか? Angularで $location
の使用が必要になると思います(ただし、?い?searchと#hashesを使用したくないのですが)。これを処理するためにExpressルートを設定する方法については不明です。
ありがとう。
after必要なデータを送信する通常のルートを実行するキャッチオールハンドラーを作成します。
app = express();
// your normal configuration like `app.use(express.bodyParser());` here
// ...
app.use(app.router);
app.use(function(req, res) {
// Use res.sendfile, as it streams instead of reading the file into memory.
res.sendfile(__dirname + '/public/index.html');
});
app.router
は、すべてのExpressルートを実行するミドルウェアです(app.get
やapp.post
など)。通常、Expressはこれをミドルウェアチェーンの最後に自動的に配置しますが、ここで行ったように明示的にチェーンに追加することもできます。
次に、URLがapp.router
によって処理されない場合、最後のミドルウェアはAngular HTMLビューをクライアントに送信します。これはany =他のミドルウェアでは処理されないURLであるため、Angularアプリは無効なルートを正しく処理する必要があります。
express 4では、おそらくすべてのリクエストをキャッチし、angularjs _index.html
_ページにリダイレクトする必要があります。 app.use(app.router);
はもう存在せず、_res.sendfile
_は廃止されました。 _res.sendFile
_ を大文字で使用してください[〜#〜 ] f [〜#〜]。
_app.post('/projects/', projectController.createProject);
app.get('/projects/:id', projectController.getProject);
app.get('*', function (req, res) {
res.sendFile('/public/index.html');
});
_
すべてのAPIルートをすべてのパスのルートの前に置きますapp.get('*', function (req, res){...}
)
私はテンプレートエンジンを使用することに興味がなかったが、Angular自身ですべてのHTMLパーシャルをプルする、Nodeここでは静的サーバーとして完全に機能しています(ただし、JSON API用ではありません。BrianFordは、ここでJadeを使用してそれを行う方法を示します。 http://briantford.com/blog/angular-express.html
私のアプリは単一ページのアプリなので、可能なURLパターンごとにエクスプレスルートを作成し、それぞれが同じことを行います。
fs.readFile(__dirname + '/public/index.html', 'utf8', function(err, content) {
res.send(content);
});
私はいくつかのリクエスト変数をAngularに渡す必要があると想定していましたが、Angularが自動的に処理します。