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');
});