【问题标题】:Angular Ui-Router isn't routing while using node.jsAngular Ui-Router 在使用 node.js 时没有路由
【发布时间】:2014-07-27 04:07:05
【问题描述】:

我正在使用 angular ui 路由器。路由器似乎在主页 index.html 上运行良好。但是任何其他导航都不起作用。

这是我的 stateprovider 角度:

var app = angular.module('myApp', ['ui.router']);


app.config(function($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise("/");

    $stateProvider
        .state("home", {
            url: "/",
            templateUrl: "../partials/home/index.html"
        })
        .state("login", {
            url:"/login",
            templateUrl: "../partials/account/login.html"
        })
        .state("register", {
            url: "/register",
            templateUrl: "../partials/account/register.html"
        })
        .state("values", {
            url: "/values",
            templateUrl: "../partials/test/values.html"
        })
    ;
});

我的主要 index.html 中的 HTML:

 <!--Content -->
    <div class="container">
        <div ui-view></div>
    </div>
    <!-- END Content -->

当我浏览 localhost:8080/login 页面时,我得到了这个:

如果找不到它,我想我什至不应该看到这个页面。它不应该因为 $urlRouterProvider.otherwise() 而将我重定向回“/”吗?除此之外,尽管模板 url /partials/account/login.html 确实存在。

我对 node.js 有点陌生,我很好奇笔记文件服务器是否正在尝试路由并胜过我的角度服务器?我正在使用 http-server,这可能是最常见的一种。

如果有帮助,我也在使用 Express Node。这里是 app.js 的代码,我认为问题可能来自:

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

/// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});


module.exports = app;

【问题讨论】:

    标签: node.js angularjs angular-routing


    【解决方案1】:



    您是否尝试过为您的部分使用相同的目录:
    将 partials/account/login.html" 移动到 partials/home/login.html"
    另外,您是使用自己的 server.js 快速配置还是 yeoman fullstack ?
    angular 显然正在处理路由,但似乎 nodejs 没有找到资产......

    确保在 server.js 中提供特定任务以提供部分文件

        function serve_partial(req,res){
          var stripped = req.url.split('.')[0];
          var requestedView = path.join('./', stripped);
          res.render(requestedView, function(err, html) {
            if(err) {
              res.render('404');
            } else {
              res.send(html);
            }
          });
        }
    
        function serve_index(req,res){
          res.render('index');
        }
    
        // Angular Routes
        app.get('/partials/*', serve_partial);
        app.get('/*', serve_index);
    

    对于你的情况,我可能会这样:

        var express = require('express');
        var path = require('path');
        var favicon = require('static-favicon');
        var logger = require('morgan');
        var cookieParser = require('cookie-parser');
        var bodyParser = require('body-parser');
    
        var routes = require('./routes/index');
        var users = require('./routes/users');
    
        var app = express();
    
        // view engine setup
        app.set('views', path.join(__dirname, 'views'));
        app.set('view engine', 'jade');
    
        app.use(favicon());
        app.use(logger('dev'));
        app.use(bodyParser.json());
        app.use(bodyParser.urlencoded());
        app.use(cookieParser());
        app.use(express.static(path.join(__dirname, 'public')));
    
        function serve_partial(req,res){
          var stripped = req.url.split('.')[0];
          var requestedView = path.join('./', stripped);
          res.render(requestedView, function(err, html) {
            if(err) {
              res.render('404');
            } else {
              res.send(html);
            }
          });
        }
    
        app.use('/partials/*', serve_partial);
        app.use('/', routes);
        app.use('/users', users);
    
        /// catch 404 and forward to error handler
        app.use(function(req, res, next) {
            var err = new Error('Not Found');
            err.status = 404;
            next(err);
        });
    
        /// error handlers
    
        // development error handler
        // will print stacktrace
        if (app.get('env') === 'development') {
            app.use(function(err, req, res, next) {
                res.status(err.status || 500);
                res.render('error', {
                    message: err.message,
                    error: err
                });
            });
        }
    
        // production error handler
        // no stacktraces leaked to user
        app.use(function(err, req, res, next) {
            res.status(err.status || 500);
            res.render('error', {
                message: err.message,
                error: {}
            });
        });
    
    
        module.exports = app;
    

    【讨论】:

    • 我在 webstorm 内部使用 express 节点配置
    • 你是如何使用实现你的 server.js 文件的。你能公布为你的静态文件提供服务的方法吗?
    • 好的尝试将 partials/account/login.html 移动到 partials/home/login.html 仍然是同样的问题。 /login 未找到。
    • 现在我只是使用节点命令 http-server 来启动它。根本没有碰过默认的东西
    • 你可以尝试添加 'app.get('/partials/*', serve_partial);'如解释;)
    【解决方案2】:

    我看到你向你的节点 api 请求没有像 /login 这样的路由,你得到 404。

    你应该试试 localhost:8080/#/login

    【讨论】:

    • 那行得通...问题如何解决它以便我可以执行 $locationProvider.html5Mode(true)?
    【解决方案3】:

    我想通了。执行以下操作即可。

    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.js 以防有人好奇它的去向。

    var express = require('express');
    var path = require('path');
    var favicon = require('static-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    
    var routes = require('./routes/index');
    
    var app = express();
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    
    app.use(favicon());
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded());
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    
    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.use('/', routes);
    
    
    
    /// catch 404 and forward to error handler
    app.use(function(req, res, next) {
        var err = new Error('Not Found');
        err.status = 404;
        next(err);
    });
    
    /// error handlers
    
    // development error handler
    // will print stacktrace
    if (app.get('env') === 'development') {
        app.use(function(err, req, res, next) {
            res.status(err.status || 500);
            res.render('error', {
                message: err.message,
                error: err
            });
        });
    }
    
    // production error handler
    // no stacktraces leaked to user
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: {}
        });
    });
    
    
    module.exports = app;
    

    当然,这需要在您的角度代码中:

    app.config(["$locationProvider", function($locationProvider) {
        $locationProvider.html5Mode(true);
    }]);
    

    需要注意的一件事让我着迷。您必须重新启动服务器才能使其正常工作。 ctr+c 然后粘贴此代码然后重新启动服务器。祝你好运

    【讨论】:

    • 你为你的路由文件夹中的服务器端路由做了什么以转到其他页面,如'/login'或'/register'?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多