我试图通过在后端创建端点并使用Angular Http服务查询来获取ID用户。
正确的语法是什么?
这是我目前的代码:
服务
voteOn(poll: Poll, userID: string, choice: number) {
var user;
this.http.get('/'+userID)
.map(response => response.json())
.subscribe(json => user = json )
user.votes.push({poll, choice });
const body = JSON.stringify(user);
const headers = new Headers({'Content-Type': 'application/json'});
const token = localStorage.getItem('token')
? '?token=' + localStorage.getItem('token')
: '';
return this.http.patch('https://voting-app-10.herokuapp.com/user'+token, body, {headers: headers})
.map((response: Response) => response.json())
.catch((error: Response) => {
this.errorService.handleError(error);
return Observable.throw(error);
})
.subscribe();
}
路线
router.get('/:userid', function (req, res, next) {
var userId = req.params.userid;
UserModel.findById(userID, function (err, user) {
return res.send(user);
});
});
显然这是不正确的。调用user.votes.push时,未定义用户变量。如何正确地将第一个查询的结果分配给用户?
SOLUTION:
voted(poll: Poll, userID: string, choice: number) {
var user;
this.http.get('/'+userID)
.map(response => response.json())
.subscribe(
json => {
user = json;
var result = "";
for (var i = 0; i < user.votes.length; i ++) {
if (user.votes[i].poll == poll.pollId) {
result = "disabled";
if (user.votes[i].choice == choice) {
result = "cheked";
}
}
}
console.log("RESULT:"+result);
return result;
}
)
}
答案 0 :(得分:-1)
在这里只谈到Angular2方面(不熟悉Express,但路由处理程序看起来正确):
在高层次上,这看起来很合理。您的核心问题是您在传递给Observable.map()的lambda中返回一个Subscription,它将它包装在一个Observable:Observable中。通常,从客户端方法中,您希望返回Observable&lt;&gt;而不是订阅&lt;&gt;,让消费客户的人决定如何订阅结果:
return this.http.patch(
'https://voting-app-10.herokuapp.com/user'+token,
body, {headers: headers})
.map((response: Response) => response.json())
.catch((error: Response) => {
this.errorService.handleError(error);
return Observable.throw(error);
})
这将返回Observable,但如果您定义一个接口并将response.json()强制转换为它,您可以获得更好的输入。
要避免外部可观察包装,请考虑使用switchMap:
this.http.get('/'+userID)
.switchMap(user =>
user.votes.push({poll, choice });
const body = JSON.stringify(user);
const headers = new Headers({'Content-Type': 'application/json'});
const token = localStorage.getItem('token')
? '?token=' + localStorage.getItem('token')
: '';
return this.http.patch('https://voting-app-10.herokuapp.com/user'+token, body, {headers: headers})
.map((response: Response) => response.json())
.catch((error: Response) => {
this.errorService.handleError(error);
return Observable.throw(error);
});
)
对于Angular Http对象的一般用法(加上样板REST客户端基类),请查看:https://gist.github.com/lokitoth/d71794061e7e03bb8c1bf73648d6733d