【问题标题】:node.js/angular.js - Cannot GETnode.js/angular.js - 无法获取
【发布时间】:2013-01-19 22:35:13
【问题描述】:

我有根路由,它工作正常。我还有另一条路线 127.0.0.1:3000/dashboard 如果我只是在地址栏中键入该 url 我收到此错误:

无法获取 /dashboard

如果我创建一个指向相同网址的链接,它就可以正常工作。

如果我然后刷新该页面,我会再次收到相同的错误。

下面是我的 node.js 路由

app.js

/**
* Module dependencies.
 */

var express = require('express')
  , routes  = require('./routes')
  , stats   = require('./routes/stats')
  , tests   = require('./routes/test')
  , http    = require('http')
  , util    = require('util')
  , path    = require('path');

var app = module.exports = express();

app.configure(function(){

  /*
   * Configuration
   *
   */
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');

  /*
   * Middleware definitions
   *
   */
  app.use(express.favicon());
  app.use(express.logger('dev'));
  /*
   * Error handling middleware
   */
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('shhhhhhhh, super secret'));
  app.use(app.router);

  // serves up dynamic css files
  app.use(require('stylus').middleware(__dirname + '/public'));
  app.use(require('less-middleware')({ src: __dirname + '/public' }));

  // serves a static path
  app.use(express.static(path.join(__dirname, 'public')));

});

app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
    app.use(express.errorHandler());
});


/*
 * Endpoints
 */
app.get('/', routes.index);

app.get('/test', tests.get);
app.post('/test', tests.post);
app.options('/test', tests.options);

app.get('/stats/sends', stats.sends.get);
app.get('/stats/events', stats.events.get);
app.get('/stats/attempts', stats.attempts.get);
app.get('/stats/errors', stats.errors.get);
app.get('/stats/mquad', stats.mquad.get);

app.get('/partials/:name', routes.partials);
app.get('/index/landing', routes.landing);
app.get('/index/dashboard', routes.dashboard);

console.log('Env: ' + app.settings.env);
http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

路由/index.js

    exports.dashboard = function(req, res){
        res.render('dashboard');
    };

角度路线

    'use strict';
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives']).
    config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
    $routeProvider.
        when('/', {
            templateUrl: 'partials/landing',
            controller: LandingCtrl
        }).
        when('/dashboard', {
            templateUrl: 'partials/dashboard',
            controller: DashboardCtrl
        }).
        otherwise({
            redirectTo: '/'
        });
    $locationProvider.html5Mode(true);
}]);

【问题讨论】:

    标签: node.js angularjs


    【解决方案1】:

    路由app.get('/index/dashboard', routes.dashboard); 指的是http://hostname/index/dashboardwhen('/dashboard', { ... }) 指的是http://hostname/dashboard

    您应该更正路线:app.get('/dashboard', routes.dashboard);

    【讨论】:

    • 感谢您的回复。但是,我得到这个 500 Express 500 Error: Failed to lookup view "dashboard" when I use the route app.get('/dashboard', routes.dashboard);
    • 试试when('/index/dashboard', { ... })。您正在使用html5Mode,并且您的所有应用程序路由都应与服务器路由相同。
    • 服务器上的app.get('/index/dashboard', routes.dashboard) 和客户端上的when('/index/dashboard', { ... }) 产生500???我不明白……如果您在 brawser 中导航到 http://hostname/index/dashboard,您会得到 500?
    • 哦,等待它的工作。抱歉,现在我无法链接到它,但我可以直接链接到该网址,但我的布局模板不起作用。当我完全工作并相信你时,我会更新。谢谢!
    • 这仍然是完全软管。感谢您的帮助,但这肯定存在更深层次的问题。我不太确定发生了什么,但显然节点路由和角度路由之间存在一些问题。
    【解决方案2】:

    这篇文章可能会有所帮助:

    http://jjt.io/2013/11/16/angular-html5mode-using-yeoman-generator-angular/

    简而言之:

    npm install --save-dev connect-modrewrite
    

    Gruntfile:

    connect: {
      options: {
        // ...
        // Modrewrite rule, connect.static(path) for each path in target's base
        middleware: function (connect, options) {
          var optBase = (typeof options.base === 'string') ? [options.base] : options.base;
          return [require('connect-modrewrite')(['!(\\..+)$ / [L]'])].concat(
            optBase.map(function(path){ return connect.static(path); }));
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      这不起作用的原因是您的服务器没有捕获所有其他路由并将它们路由到由routes.index 提供服务的单页应用程序。

      为了捕获所有其他路由并将它们路由到索引页面,以便您的 Angular 应用程序可以查看它是否与提供的 url 匹配,您需要做的就是在声明最后一条路由后添加以下行:

      app.get('*', routes.index);
      

      现在您应该能够:

      • 直接导航到 Angular.js 应用提供的网址
      • 无错误地刷新任何页面

      【讨论】:

        【解决方案4】:

        我建议在前端和后端使用非常快速的 javascript 解决方案。

        NodeJs

        // set up our one route to the index.html file
            app.get('*', function (req, res){
            res.sendFile(path.join(__dirname+'/public/index.html'));
        });
        

        这段代码告诉本地/远程服务器主html在哪里,所以它可以找到其余的模板。

        AngularJs

        // If 404 Redirect to home
        $routeProvider.otherwise( { redirectTo: '/'} );
        

        这也很有帮助,所以永远不会去丢失的页面。

        【讨论】:

        • 从此res.sendFile(path.join(__dirname+'/public/index.html'));路径是什么
        • @Kartheeks 路径是 const path = require('path');
        猜你喜欢
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多