【问题标题】:Routing error with angular.js and expressangular.js 和 express 的路由错误
【发布时间】:2013-06-08 12:05:52
【问题描述】:

我正在尝试使用 angular.js 围绕 /parent 根进行路由,如果我使用锚链接等(也就是纯粹从 angular 处理的路由。例如,href 为 '/parent/ 的链接) createdtudent' 有效。但是,当我在 url 栏中键入它或当它已经在该位置时刷新它时,它会生成一个错误,因为后端路由尚未完成。

因此,我在 express 中尝试了一个包罗万象的路由('/parent/*'),但这会导致我的所有 js 和 css 都没有被读取的错误。有谁知道如何解决这个问题?

我的静态文件目录

public
  -> javascripts
      -> app.js
      -> angular.js
  -> stylesheets
  -> images

错误:

Resource interpreted as Script but transferred with MIME type text/html: "http://localhost:3000/parent/javascripts/jquery.js". home:1
Resource interpreted as Script but transferred with MIME type text/html: "http://localhost:3000/parent/javascripts/angular.js". home:1
Resource interpreted as Script but transferred with MIME type text/html: "http://localhost:3000/parent/javascripts/main.js". home:1
Uncaught SyntaxError: Unexpected token < jquery.js:1
Uncaught SyntaxError: Unexpected token < angular.js:1
Uncaught SyntaxError: Unexpected token < 

快递

app.get('/parent', function(req, res) {
  res.render('main')
});
app.get('/parent/*', function(req, res) {
  res.render('main')
});

角度路由(我在视图本身中声明控制器)

var app = angular.module('app', []).config(function($routeProvider, $locationProvider) {
  $locationProvider.html5Mode(true);
  $routeProvider.when('/parent/login', 
    {
      templateUrl: '../templates/login.html'
    }).
    when('/parent/home', 
    {
      templateUrl: '../templates/home.html'
    }).
    otherwise(
    {
      redirectTo: '/parent'
    })
})

【问题讨论】:

    标签: javascript angularjs express


    【解决方案1】:

    这是一个新引入的“行为改变”(或错误)。

    尝试使用基本标签:

    <base href="/" />
    

    【讨论】:

    • 所以如果我理解正确的话,Angular 路由也与当前 URL 相关,即使它们以 / 开头?
    • 当您启动 Angular 时,它会在最后一个 / 之后启动所有内容并将其用作基本 url - 除非另有说明:)。
    • 感谢@Ven 的解释。任何人都得到了记录在哪里的链接?
    • 嘿,这解决了收到此错误的问题,但之后我开始在 css 库上收到 404。
    【解决方案2】:

    您也通过/parent 为您的 JS/CSS 提供服务:

    ... http://localhost:3000/parent/javascripts/jquery.js
                             ^^^^^^^
    

    因此,如果您在声明 express.static 中间件之前声明您的路由,您的包罗万象的路由将处理所有 JS/CSS 请求。

    您应该使用类似于此的设置:

    // express.static() first...
    app.use('/parent', express.static(__dirname + '/public'));
    
    // ...followed by your catch-all route (only one needed)
    app.get('/parent*', function(req, res) {
      res.render('main')
    });
    

    【讨论】:

    • 嗨罗伯特,谢谢你的回答。目前我在静态文件之前没有父目录 - 角度自然会假设我有,因为我是从 /parent 服务的吗?
    • @DanTang 不,Angular 没有,但我认为您的 HTML 看起来像这样:&lt;script src="javascripts/angular.js"&gt;&lt;/script&gt;? (在javascripts/ 前面没有/)。如果是这样,您的浏览器将加载相对于当前页面 URL 的 JS 文件。
    • 嗯,有道理。抱歉,我能否再问一个问题 - 我将我的 javascripts 更改为“/javascripts”,现在它有时可以工作。就像当我从 /parent 开始时,/parent/home 和 /parent/login 的链接可以工作,但是一旦我刷新它,它就会直接进入 /parent(因为我将它重定向到'/'),但是当我点击在链接上(例如 /parent/login),它立即更改为 /parent 而不是 /parent/login。你知道我该如何解决吗?
    • @DanTang 如果你在/parent/home 并刷新,它应该留在那里,因为你已经在 Angular 中声明了一个路由。我不明白为什么它会将您重定向回/parent。检查浏览器的控制台日志,看看 Angular 是否产生任何错误。
    • 嗯,我没有更多的角度错误,但它确实将我重定向回父级(我认为这可能是因为我另外定义了({redirectTo: '/'})?跨度>
    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多