Noa*_*oah 18 javascript node.js express angularjs angular-ui-router
我知道还有其他答案,但他们似乎有警告.
这个导致重定向,这对于使用Mixpanel的前端应用程序来说可能是致命的,而混合面板的双重加载将导致浏览器中的最大调用堆栈大小超出错误.
这个使用sendFile我个人无法工作.试图诊断,我只是建议使用express.static().
目前我的代码如下所示:
home.js - 一些路线,最后一个路线是前端站点.
var indexPath = path.resolve( __dirname, '../' + process.env.PUBLIC_FOLDER )
router.get( '/:user/:stream/:slug', function( req, res, next ) {
    if ( req.headers['user-agent'].indexOf( 'facebook' ) != -1 ) {
        // stuff to handle the Facebook crawler
    } else return next()
})
router.get( '/*', function( req, res ) {
    express.static( indexPath )
})
server.js - 配置node/express
app = express();
app 
    .use( morgan( 'dev' ) )
    .use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
    .use( bodyParser.json( { limit: '50mb' } ) )
    .use( '/api', require('./routes/usersRoute.js') )
    .use( '/', require( './routes/home' ) )
    .on( 'error', function( error ){
       console.log( "Error: " + hostNames[i] + "\n" + error.message )
       console.log( error.stack )
    })
http
    .createServer( app ).listen( process.env.PORT )
    .on( 'error', function( error ){
       console.log( "Error: " + hostNames[i] + "\n" + error.message )
       console.log( error.stack )
    })
更多信息
你可以看到我想要使用的原因express.static()是因为当我使用res.sendfile()我得到一个问题,像这样的地方控制台说Unexpected token '<'.不幸的是,答案没有指明一个确切的解决方案,提问者也没有说他们解决了问题,但没有分享答案.
在我的试验和错误中,我添加了更多来表达,像这样
.use( '/app/app.js', express.static( indexPath + '/app/app.js' ) )
.use( '/app/views', express.static( indexPath + '/app/views' ) )
.use( '/app/controllers', express.static( indexPath + '/app/views' ) )
.use( '/app/directives', express.static( indexPath + '/app/views' ) )
.use( '/app/vendor', express.static( indexPath + '/app/vendor' ) )
.use( '/js', express.static( indexPath + '/js' ) )
.use( '/css', express.static( indexPath + '/css' ) )
.use( '/fonts', express.static( indexPath + '/fonts' ) )
.use( '/images', express.static( indexPath + '/images' ) )
.use( '/api', require('./routes/usersRoute.js') )
.all( '/*', require( './routes/home' ) )
在我的home.js路线文件中添加了这个
router.get( '/*', function ( req, res ) {
    res.status( 200 ).set( { 'content-type': 'text/html; charset=utf-8' } )
    .sendfile( indexPath + '/index.html' )
})
在浏览器中,我可以看到我的所有文件都在加载,但<上面的错误./*/当我刷新时,我看到这条路线被调用了数百次,所以我认为.use( '...', ... )配置被忽略了.
以下是Jonas要求的另一个例子.
var indexPath = path.resolve( __dirname, process.env.PUBLIC_FOLDER )
mongoose.connect( process.env.MONGOLAB_URI )
app = express();
app 
    .use( morgan( 'dev' ) )
    .use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
    .use( bodyParser.json( { limit: '50mb' } ) )
    .use( '/api', require('./routes/usersRoute.js') )
    .use( '/', require( './routes/home.js' ) )
    .use( express.static( indexPath ) )
    .on( 'error', function( error ){
       console.log( "Error: " + hostNames[i] + "\n" + error.message )
       console.log( error.stack )
    })
我也做了相同的没有.use( '/', require( './routes/home.js' ) )线尝试缩小任何问题,但它是相同的结果.如果我#在URL中有页面,那么页面将加载,但浏览器将删除#(到目前为止一直很好).但是,如果我按刷新或手动放在URL,SANS-hashbang,它会像给出一个错误Cannot GET /home/splash,其中/home/splash的任何路径我要去.
Jon*_*nas 12
您可能以错误的方式使用快速中间件.查看文档告诉我例如以下代码
.use( '/images', express.static( indexPath + '/images' ) )
indexPath + '/images'使用此类URL 为该文件夹下的任何文件提供服务:
http://localhost:3000/images/kitten.jpg
http://localhost:3000/images/logo.png
http://localhost:3000/images/whatever.jpg
这是你期望它做的吗?
我的建议是改变
.use( '/', require( './routes/home' ) )
至
.use(express.static( indexPath ))
因为根据文档,它将提供indexPath从根路径的文件夹下的所有静态文件,也就是说.没有前缀.
我认为,到目前为止,我可以帮助您完成所有的输入.如果这不起作用,也许你可以分享一些我可以用来自己重现它的小代码示例.
好.我试图创建一个简单的例子.我通过以下方式使其工作.我的目录结构是这样的:
|- index.js
|- public/
|---- index.html
|---- test.html
|---- main.js
|---- angular.js
|---- angular-route.js
index.js是节点服务器.注意路由的顺序.我还添加了一些/home/login示例,以明确如何添加不应通过角度的其他服务器路由.
var http = require('http');
var express = require('express');
var app = express();
app
    .use(express.static('public'))
    .get('/home/login', function (req, res) {
        console.log('Login request');
        res.status(200).send('Login from server.');
    })
    .all('/*', function ( req, res ) {
        console.log('All');
        res
            .status( 200 )
            .set( { 'content-type': 'text/html; charset=utf-8' } )
            .sendfile('public/index.html' );
    })
    .on( 'error', function( error ){
       console.log( "Error: \n" + error.message );
       console.log( error.stack );
    });
http
    .createServer( app ).listen( 8080 )
    .on( 'error', function( error ){
       console.log( "Error: \n" + error.message );
       console.log( error.stack );
    });
console.log('Serving app on port 8080');
index.html 很简单.
<!doctype html>
<html>
<head>
    <title>Angular HTML5 express test</title>
    <script type="text/javascript" src="angular.js"></script>
    <script type="text/javascript" src="angular-route.js"></script>
    <script type="text/javascript" src="main.js">
    </script>
</head>
<body ng-app="app">
    <div ng-view></div>
</body>
</html>
main.html只是添加一些内容.重要的是链接/test
<div>
    <h1>This is just a {{val}}</h1>
    <button ng-click="clicked()">Click me!</button>
    <span>You clicked {{counter}} times</span>
    <a href="/test">test me!</a>
</div>
test.html 实际上是无关紧要的
<div>
    <h4>What a beautiful day to test HTML5</h4>
</div>
main.js 正在做核心角色html5的工作
angular.module('app', ['ngRoute'])
    .config(function($locationProvider) {
        $locationProvider
            .html5Mode({
                enabled: true, // set HTML5 mode
                requireBase: false // I removed this to keep it simple, but you can set your own base url
            });
    })
    .config(function($routeProvider) {
        $routeProvider
            .when('/test', {templateUrl: 'test.html', controller: function() {
                console.log('On /test.');
            }})
            .when('/', {templateUrl: 'main.html', controller: 'MyTestCtrl'})
            .otherwise('/');
    })
    .controller('MyTestCtrl', function ($scope) {
        self = $scope;
        self.val = 'TeSt';
        self.counter = 0;
        var self = self;
        self.clicked = function() {
            self.counter++;
        };
    });
代替:
router.get( '/*', function( req, res ) {
    express.static( indexPath )
})
做
router.get( '/:anyreq', function( req, res ) {
    express.static( indexPath )
})
只需将其保留在路径文件的末尾.
| 归档时间: | 
 | 
| 查看次数: | 8832 次 | 
| 最近记录: |