Javascript $http.get请求仅在第一页加载时成功

Javascript $http.get请求仅在第一页加载时成功,javascript,angularjs,node.js,Javascript,Angularjs,Node.js,下面是一个场景:用户访问http://localhost:3000/all,页面上将显示所有用户的列表。太好了,这就是我想要的。但是,当我刷新页面时,我丢失了所有内容(没有呈现HTML)。我只剩下服务器返回的原始JSON输出 我的角度文件的相关部分: var app = angular.module('social', ['ngRoute', 'ngCookies', 'ui.router']) app.config(function($routeProvider, $locationProv

下面是一个场景:用户访问
http://localhost:3000/all
,页面上将显示所有用户的列表。太好了,这就是我想要的。但是,当我刷新页面时,我丢失了所有内容(没有呈现HTML)。我只剩下服务器返回的原始JSON输出

我的角度文件的相关部分:

var app = angular.module('social', ['ngRoute', 'ngCookies', 'ui.router'])

app.config(function($routeProvider, $locationProvider, $stateProvider, $urlRouterProvider) {
    $routeProvider
   .when('/', {
    templateUrl: 'home.html',
    controller: 'HomeController'
    })
   .when('/login', {
    templateUrl: 'login.html',
    controller: 'LoginController'
    })
   .when('/signup', {
    templateUrl: 'signup.html',
    controller: 'SignupController'
    })
   .when('/about', {
    templateUrl: 'about.html'
    })
   .when('/profile', {
    templateUrl: 'profile.html',
    controller: 'UserProfileController',
   })
   .when('/all', {
    templateUrl: 'members.html',
    controller: 'MembersController',
    resolve: {
        allMembers: function($http) {
            return $http.get('/all').then(function(res) {
                return res.data
            })
        }
    }
   })
   $locationProvider.html5Mode(true)
})

app.controller('MembersController', function($http, $scope, $cookies) {
    function getAllUsers() {
        $http.get('/all').then(function(res) {
            $scope.members = res.data
        })
    }
    getAllUsers()
})
您会注意到,我试图在
app.config
中使用
resolve
,但没有任何帮助(我可能使用不正确)。使用
resolve
时,我的控制器变为:

app.controller('MembersController', function(allMembers, $scope) {
    $scope.members = allMembers
})
我得到了相同的结果:数据在初始页面加载时加载良好,但在刷新时,页面上留下了原始JSON

服务器中的相关部分(使用Mongoose):

谁能告诉我我做错了什么?在我自己尝试之前,我遵循了一个在线教程,在教程中效果很好(显然)。

这是意料之中的

似乎只有您的
/
路线服务于角度应用程序

/all
路由是您的API,因此当您请求它时(刷新页面后),您的浏览器将呈现服务器发送的内容–即
res.json(用户)

您可能想做的是为API命名名称空间

您可以创建一个API路由器:

const app = express();
const api = express.Router();
api.get('/all', (req, res) => {
    // ...
    res.json(users);
});

// ...

app.use('/api', api);
app.get('/*', (req, res) => {
    res.sendFile('path/to/your/index.html');
});

这将确保除API路由之外的所有路由都能为角度应用程序服务。

这是错误的,也是一种不好的做法:
if(err)console.log(err)
,因为用户不会包含任何内容。根据发生的情况,您应该返回HTTP 400或500,以及一个经过清理的错误。我不太确定“用户不会包含任何内容”是什么意思。如果(err)throw err将其更改为
if(err)throw err
似乎没有什么区别,我不确定这与我面临的问题有什么关系。如果抛出错误,将泄漏与请求相关的所有内容,包括客户端连接,这将是更糟糕的,也是最容易让服务超负荷运行的方法。您需要发送错误响应,而不是抛出。除非您有一个错误处理中间件,它捕获路由抛出的异常并返回错误响应。但是,这种错误处理程序不适用于异步代码,只适用于同步代码。只需返回下一个(错误)那么,这个<代码>app.get('/all',函数(req,res,next){User.find(函数(err,users){if(err)return next(err)return res.json(users)})})是。此外,尝试添加一个快速错误处理中间件,您应该可以。
const app = express();
const api = express.Router();
api.get('/all', (req, res) => {
    // ...
    res.json(users);
});

// ...

app.use('/api', api);
app.get('/*', (req, res) => {
    res.sendFile('path/to/your/index.html');
});