我的Angular get请求的正确语法是什么?

时间:2017-05-19 16:35:19

标签: javascript node.js angular service

我试图通过在后端创建端点并使用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;
          }
      )
    }

1 个答案:

答案 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