Как заставить экспресс-маршрутизацию работать с маршрутизацией Angular с URL-адресами в стиле HTML5?

Я хотел бы создать приложение AngularJS с URL-адресами в стиле HTML5 (т.е. без фрагмента # в URL-адресе). Таким образом, в модуле контроллера маршрутизации моего приложения Angular у меня есть что-то вроде следующего:

angular.module('app').config(['$routeProvider','$locationProvider',function($routeProvider,$locationProvider) {
    $locationProvider.html5Mode(true)
...
}

$routeProvider
.when('/1/:param', /* do something */)
.when('/2/:param', /* do something else */)
.when('/3/:param', /* do something else again*/);

Ряд рабочих примеров, таких как AngularFun, не используют режим HTML5. Для такого запроса, как http://localhost:3005/#/1/foo, ясно, что

  • часть http://localhost:3005/ обрабатывается Express на стороне сервера /. Express с радостью обслуживает наши index.html с поддержкой Angular
  • маршрут /1/foo обрабатывается маршрутизатором Angular на стороне клиента.

Скажем, наш server.coffee стандартно выглядит примерно так, как показано ниже (мы обслуживаем статический каталог dist, который содержит наши скомпилированные минимизированные исходники Angular:

express = require 'express'
routes = require './routes'
dir = "#{__dirname}/dist"            # sources live here
port = process.env.PORT ? process.argv.splice(2)[0] ? 3005
app = express()

app.configure -> 
    app.use express.logger 'dev'
    app.use express.bodyParser()
    app.use express.methodOverride()
    app.use express.errorHandler()
    app.use express.static dir       # serve the dist directory
    app.use app.router
    routes app, dir                  # extra custom routes

Если мы используем режим HTML5, наш URL-адрес http://localhost:3005/#/1/foo становится http://localhost:3005/1/foo (больше нет хэша #). На этот раз весь URL-адрес перехватывается Express, и он путается, потому что мы не определяем маршруты, отличные от /.

Что мы действительно хотели бы сказать, так это то, что последняя часть URL-адреса (/1/foo) должна быть «делегирована» Angular для обработки. Как мы можем это сказать?


person fatuhoku    schedule 04.03.2013    source источник
comment
Я не пользователь Express, но этот вопрос должен относиться к любому бэкенду Angular. Если вы просто проинструктируете свой Express перенаправлять все на root (localhost:3005), вы должны открыть свой интерфейс Angular, и оттуда Angular должен выбрать относительный путь и выяснить, какой клиентский маршрут открыть. Итак, если пользователь запрашивает localhost:3005/1/foo, ваш Express должен обслуживать HTML так, как если бы он получил запрос к localhost:3005. В этот момент, как только ваш обслуживаемый HTML загрузит Angular, Angular должен выбрать текущее местоположение и выяснить, какое представление/ctrl на стороне клиента открыть.   -  person Stewie    schedule 04.03.2013
comment
Вы нашли решение?   -  person Andrea Reginato    schedule 13.04.2013


Ответы (1)


Оказывается, все работает. Однако я не делал эту работу сам. Я полагался на этот каркасный проект: https://github.com/thanh-nguyen/angular-express-seed-coffee

Это позволяет вам в определенной степени контролировать, какие пути обрабатываются клиентом, а какие сервером.

person fatuhoku    schedule 15.04.2013