如何使Angularjs路由与html5mode上的expressJs路由一起工作

Joh*_*Lim 4 javascript node.js express angularjs

我已经发布了一个关于stackoverflow的问题(css和javascript没有包含在刷新上)昨天在刷新网页并发现它是由html5mode引起的问题为什么css和javascript没有包含在我的网页上的问题,所以我从昨天起就一直在寻找这个问题的解决方案,但我无法得到答案.

我的文件夹结构

在此输入图像描述

app.js

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , mongoose = require('mongoose');

var app = module.exports=express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/public/views');
app.set('view engine', 'ejs');
app.use(express.cookieParser());
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);
app.use(function(request, response)
{
    console.log("catch all");
    writeFile("/public/views/master.ejs", request, response);
});
// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}
app.use(function (req,res) {
 res.status(404).render('error', {
                url: req.originalUrl
            });
});

app.get('/', routes.index);
app.get('/:name', routes.view);
app.get('*', routes.risk);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
Run Code Online (Sandbox Code Playgroud)

index.js

exports.index = function(req, res){
  res.render('master', { title: 'Hello World' });
};
exports.view = function (req, res) {
  var name = req.params.name;
  res.render(name);
};
exports.risk = function(req, res){
  res.sendfile(__dirname + "/public/views/master.ejs");
};
Run Code Online (Sandbox Code Playgroud)

对于exports.risk我试图让expressJs渲染母版页1在它渲染其他之前但它不起作用.

angularJs

var SymSal = angular.module('SymSal',[]).
 config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
    $routeProvider.
      when('/', {
        templateUrl: 'main.ejs',
        controller: 'IndexCtrl'
      }).
      when('/login',{
        templateUrl: 'login.ejs',
        controller: 'IndexCtrl'
      }).
      when('/register',{
        templateUrl: 'register.ejs',
        controller: 'IndexCtrl'
      }).
      when('/about',{
        templateUrl: 'about.ejs',
        controller: 'IndexCtrl'
      }).
      otherwise({
        templateUrl: 'error.ejs'

      });
    $locationProvider.html5Mode(true);
  }]);

 SymSal.controller('IndexCtrl',function(){

 })
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助,谢谢!

bek*_*ite 5

对于exports.risk我试图让expressJs渲染母版页1在它渲染其他之前但它不起作用.

路由按顺序匹配:

app.get('/', routes.index);
app.get('/:name', routes.view);
app.get('*', routes.risk);
Run Code Online (Sandbox Code Playgroud)

如果路由匹配'/'渲染routes.index.如果路由与'/'不匹配,请检查它是否与'/:name'匹配(例如/ login,/ register)并渲染routes.view.如果路由与'/'和'/:name'不匹配(例如,路由类似于/ user/1),则会渲染routes.risk.

要使快速渲染主页首先需要删除"/"和"/:name"的路径匹配器,并保留与每条路径匹配的通用匹配器('*').

现在,无论您提供什么URL,服务器都将发回母版页.如果你调用localhost:3000/login,服务器将发回主页面(如果你调用localhost:3000,则会返回相同的页面).Angular将看到指定了路径(/ login)并将调用相应的$ routeProvider.when()函数.

要处理api调用(例如从db获取数据,将数据保存到db),您需要为此指定路由匹配器并将其放在通用匹配器('*')上方:

app.get('/api', routes.api);
Run Code Online (Sandbox Code Playgroud)

重要的是要提到你不要在$ routeProvider.when()中使用'/ api'.

剩下的是正确处理静态文件:记住每个URL都由通用匹配器('*')处理.因此静态文件使用错误的MIME类型进行渲染.要解决此问题,您需要在特定路径下访问所有静态文件,例如'/ static'.只需更新

app.use(express.static(path.join(__dirname, 'public')));
Run Code Online (Sandbox Code Playgroud)

至

app.use('/static', express.static(path.join(__dirname, 'public')));
Run Code Online (Sandbox Code Playgroud)

您需要更新母版页中的所有路径以匹配新模式:'/ js/angular.js'现在是'/static/js/angular.js'