处理单页应用程序URL路由

时间:2014-09-18 08:17:24

标签: node.js express

我希望所有请求都返回index.html页面,其中包含将处理自己的路由的前端应用程序。此外,我希望正确返回css / html / images / js,以便不返回所有这些的index.html。所以我在server.js中有类似的东西

var express = require('express');
var app = express();
var path = require("path");


app.use(express.static(path.join(__dirname,"app")));
app.get('*', function(req, res) {
    console.log(res);
    res.sendFile(path.join(__dirname, 'app', 'index.html')); // load the single view file (angular will handle the page changes on the front-end)
});


app.listen(5000);

现在,如果我输入localhost:5000,我可以获得所有资源,而且每件事情都可以。但是如果我localhost:5000/something我认为express.static找不到所有资源,并由app.get(*,...)处理,那么所有资源都会以index.html的形式返回。

那么我怎样才能让这种设置起作用?!

2 个答案:

答案 0 :(得分:2)

这是正确的方法。阅读评论。

var staticUrl = '/static';
var publicFolder = path.resolve(__dirname, '../public')//make sure you reference the right path

//serve all atatic files prefixed with '/static/*'
app.use(staticUrl, express.static(publicFolder));
app.use(staticUrl, function(req, res, next) {
  res.send(404); 
});

//serve index.html for all not 'static' prefixed requests
app.all('/*', function(req, res) {
  res.sendfile('index.html', {root: publicFolder});
});

答案 1 :(得分:0)

这是我在Node.js + AngularJS项目中使用的代码。

    app.use(function (req, res, next) {
        if (path.extname(req.path).length > 0) {
            // normal static file request
            next();
        }
        else {
            // should force return `index.html` for angular.js
            req.url = '/index.html';
            next();
        }
    });
    // static file serve
    app.use(express.static(__dirname + '/app'));