如何关闭AngularJs中的hashbangmode& Node.js的?

时间:2016-03-15 08:46:25

标签: angularjs node.js express

经过多次努力,我提出了这个问题。但遗憾的是没有结果。我正在使用angularjs和expressjs。我使用$location.html5Mode(true)关闭了hashbang模式并添加了<base href="/">。它一目了然。但是当我按下F5按钮时。它向我展示了一个非常难看的页面,没有任何css或js脚本加载????任何帮助,将不胜感激。我目前正在使用带有node.js的expressjs骨架。

这是我的App.Js文件代码

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

var app = express();

var viewRoutes = require('./routes/view'),
    loginRoutes = require('./routes/login');

// view engine setup
app.set('views', path.join(__dirname, 'views'));  //setting to HTML engine instead of EJS | JADE 
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use('/', viewRoutes);
app.use('/login', loginRoutes);




// 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;

这是我的COntroller文件编号:

var amApp = angular.module('amApp', ['ngRoute']);

amApp.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {
    $locationProvider.html5Mode(true);
    $routeProvider
        .when('/', {
            templateUrl: '/home',
            controller: 'homeCtrl'
        })
        .when('/home', {
            templateUrl: '/home',
            controller: 'homeCtrl'
        })
        .when('/login', {
            templateUrl: '/login',
            controller: 'loginCtrl'
        })
        .otherwise('/');
}]);

这是名为view.js的路线文件

var express = require('express');
var router = express.Router();

/* GET home page. */

router.get('/', function(req, res, next) {
  res.render('index');
});


router.get('/home', function(req, res, next) {
  res.render('pages/home');
});

router.get('/login', function(req, res, next) {
  res.render('pages/login');
});

module.exports = router;

我正在使用HTMl而不是EJS或JADE ..

3 个答案:

答案 0 :(得分:0)

您应该检查资源的链接。

如果转向html5模式,还必须修改其他资源(如css)的链接!

打开开发人员工具(https://developers.google.com/web/tools/chrome-devtools/)并检查错误消息。所有路径都是正确的吗?

相应地更改路径,然后重试:)

答案 1 :(得分:0)

您需要在viewRoutesloginRoutes文件中添加类似这些代码行的内容(这需要是服务器端的),您应该做得很好。每当有人尝试请求以/home/login开头的网址时,这些都会在网址中添加哈希值。如果您有任何问题,请告诉我。

&#13;
&#13;
app.get('/home/*', function(req, res) {
  res.redirect('/#' + req.originalUrl);
});

app.get('/login/*', function(req, res) {
  res.redirect('/#' + req.originalUrl);
});
&#13;
&#13;
&#13;

我们假设您的网页在正常情况下处于mypage.com/#/index。服务器将处理对mypage.com/的请求,您的Angular代码将处理#/index路由。当您关闭hashbang时,您现在拥有:mypage.com/index。当您刷新页面时,您的浏览器将尝试转到mypage.com/index,这通常由您的服务器作为/index路由处理,因为没有哈希。我假设您还没有(在您的服务器中)编写该路由的处理程序,这就是显示奇怪页面的原因。该页面甚至可能是一个意外访问的静态文件,具体取决于命名和服务器配置。

我在我制作的网站上遇到了同样的问题,并且必须通过快递处理这条路线,才能将mypage.com/index重新路由到mypage.com/#/index。这会将用户发送到角度路由的正确位置,然后浏览器将隐藏hashbang。我的快速服务器上的代码适用于我的页面:

&#13;
&#13;
app.get('/chat-room/*', function(req, res) {
	res.redirect('/#' + req.originalUrl);
});

app.get('/admin/*', function(req, res) {
	res.redirect('/#' + req.originalUrl);
});
&#13;
&#13;
&#13;

这会将对mydomain.com/chat-room/mydomain.com/admin/的任何请求重定向到相应的mydomain.com/#/chat-room/mydomain.com/#/admin/正确的角度路由。

答案 2 :(得分:0)

您应该处理快递应用中的所有路线,而不仅仅是默认的“/”路线。当您在“/".

以外的状态刷新页面时,快递应用程序无法确定更新的路径

this问题中查看我的答案。