Angular/JS Express 应用程序在生产模式下处于无限路由循环,在开发模式下工作正常

Tom*_*und 3 javascript node.js express angularjs

我有一个基于generator-angular-fullstack. 它在开发模式 ( ) 下工作正常grunt serve,但在生产模式 ( ) 下陷入似乎无限的路由循环grunt serve:dist

我的服务器控制台输出如下:

Express server running on http://localhost:9000 in production mode
finished populating things
finished populating users
GET / 200 39ms - 1.41kb
GET /views/ui-editor/editor.html 200 15ms - 1.41kb
Run Code Online (Sandbox Code Playgroud)

我的 NodeJS 路由代码如下所示:

module.exports = function(app) {

    // Server API Routes
    app.get('/api/awesomeThings', api.awesomeThings);

    app.post('/api/users', users.create);
    app.put('/api/users', users.changePassword);
    app.get('/api/users/me', users.me);
    app.get('/api/users/:id', users.show);

    app.post('/api/session', session.login);
    app.del('/api/session', session.logout);

    // All other routes to use Angular routing in app/scripts/app.js
    // TODO: redo so won't list all subfolders like this: http://stackoverflow.com/questions/18553847/express-angular-routing-causing-infinite-loop-crash
    app.get('/partials/*', index.partials);
    app.get('/common/*', index.partials);
    app.get('/ui-editor/*', index.partials);
    app.get('/*', middleware.setUserCookie, index.index);

    app.get('/:session', function(req, res) {
        res.render('views/index.html', {
            title: 'My App'
        });
    });

};
Run Code Online (Sandbox Code Playgroud)

...以及我的 AngularJS 路由代码:

$routeProvider
    .when('/main', {
        templateUrl: 'partials/main',
        controller: 'MainCtrl'
    })
    .when('/login', {
        templateUrl: 'partials/login',
        controller: 'LoginCtrl'
    })
    .when('/signup', {
        templateUrl: 'partials/signup',
        controller: 'SignupCtrl'
    })
    .when('/settings', {
        templateUrl: 'partials/settings',
        controller: 'SettingsCtrl',
        authenticate: true
    })
    .when('/:session', {
        templateUrl: 'views/ui-editor/editor.html',
        controller: 'weldEditorController'
    })
    .otherwise({
        redirectTo: '/my-project'
    });
Run Code Online (Sandbox Code Playgroud)

更新:由于我怀疑文件被错误地复制到 /dist 文件夹中,因此以下是 /dist 的内容:

|-/.git (files inside)
|-/lib
|---config
|-----config.js
|-----dummydata.js
|-----env
|-------all.js
|-------development.js
|-------production.js
|-------test.js
|-----express.js
|-----passport.js
|---controllers
|-----api.js
|-----index.js
|-----session.js
|-----users.js
|---middleware.js
|---models
|-----thing.js
|-----user.js
|---routes.js
|---socket.js
|-/package.json
|-/Procfile
|-/public
|---bower_components (files inside)
|---images (files inside)
|---scripts
|-----c9afc898.vendor.js
|-----e4b45689.scripts.js
|---styles
|-----a5896f90.main.css
|-/server.js
|-/views
|---404.html
|---index.html
|---partials
|-----login.html
|-----main.html
|-----navbar.html
|-----settings.html
|-----signup.html
|---ui-editor
|-----editor.html
|-----weldPropertiesPanel.html
Run Code Online (Sandbox Code Playgroud)

tma*_*ini 5

当某些资源无法加载时,最有可能出现此问题。

因为当前配置中的 Express 服务器不发送 404,而是发送回index,如 中的这一行routes.js,导致无限循环并使浏览器窗口崩溃:

app.get('/*', middleware.setUserCookie, index.index);
Run Code Online (Sandbox Code Playgroud)

它可能只是未找到的字体或角度模板。调试的最佳选择是将上面的行更改为

app.get('/', middleware.setUserCookie, index.index);
Run Code Online (Sandbox Code Playgroud)

并在网络选项卡中查看哪些 http 请求失败。然后确保您的grunt build作业复制了所有必需的文件/文件夹。