如何在NodeJS和Express中使用AngularJS html 5模式?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (89)

我使用一个带有Express的NodeJS服务器来服务我的AngularJS应用程序。当我使用angularJS默认路由(Hashbang)时,这一切都很好,但现在我正在尝试激活HTML 5模式。

我正在激活html 5模式,如下所示:

$locationProvider.html5Mode(true).hashPrefix('!');

这就是我的NodeJSapp.js文件如下:

var path     = require('path'),
    express  = require('express'),
    app      = express(),
    routes   = require(path.join(__dirname, 'routes'));

app.configure(function() {
    app.use(express.logger('dev'));
    app.use(express.compress());
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(app.router);
    app.all("/*", function(req, res, next) {
        res.sendfile("index.html", { root: __dirname + "/../app" });
    });
    app.use(express.errorHandler({
        dumpExceptions: true, 
        showStack: true
    }));
});

但是,这现在可以将所有请求作为我的index.html文件,因此我从需求JS中获得以下错误:

Uncaught SyntaxError: Unexpected token < 

我尝试在我的NodeJS中添加以下内容app.js因此,它将正确地服务于我的资源:

app.use("/js", express.static(__dirname + "/../app/js"));
app.use("/img", express.static(__dirname + "/../app/img"));
app.use("/css", express.static(__dirname + "/../app/css"));
app.use("/partials", express.static(__dirname + "/../app/partials"));

我还试着替换app.all声明:

app.use(function(req, res) {
  // Use res.sendfile, as it streams instead of reading the file into memory.
  res.sendfile(__dirname + '/../app/index.html');
});

但这也没用。我能做些什么来让angularJS html5模式与NodeJS和Express一起工作呢?谢谢。

提问于
用户回答回答于

您的初始修复(为特定前缀声明静态中间件处理程序)应该工作正常,但您需要确保声明: app.use("/js", express.static(__dirname + "/../app/js")); app.use("/img", express.static(__dirname + "/../app/img")); app.use("/css", express.static(__dirname + "/../app/css")); app.use("/partials", express.static(__dirname + "/../app/partials")); // any other routes: app.all("/*", ...);

另外,您需要确保前缀的静态处理程序实际上声明为OK(正确的路径),否则它们将无法找到任何请求的文件,请求将传递到中间件链,并最终由CATC-all处理程序处理。

用户回答回答于

配置如下所示:

app.use(express.static(__dirname + '/public'));

app.get('/*', function(req, res){
    res.sendFile(__dirname + '/public/index.html');
});

angular:

app.config(function($stateProvider, $urlRouterProvider, $locationProvider){
    $stateProvider
        .state('home', {
            url: '/',
            templateUrl: 'templates/main.html'
        })
        .state('register', {
            url: '/register',
            templateUrl: 'templates/register.html'
        });

    $urlRouterProvider.otherwise("/");
    $locationProvider.html5Mode({
        enabled: true,
        requireBase: false
    });
});

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励